js有序数组的连接问题


Posted in Javascript onOctober 01, 2013

1.前言 

昨天碰到一道关于如何解决有序数组的连接问题,这是一个很常见的问题。但是这里要考虑到代码的效率问题,因为要连接的数组都是有序的,这是一个非常重要的前提条件。

2.简单但效率不高的算法 

 我首先想到的是使用内置的concat方法,然后再对其进行排序,这种方法完全没有考虑到数组是有序的前提条件,代码如下:    

function concatSort(arrA,arrB){ 
     return arrA.concat(arrB).sort(); 
}

为了弄清楚sort排序到底使用的是什么算法,特地到看了V8引擎的算法(连接),大概意思是当数组的长度较短的时候使用的是插入排序(InsertionSort),当数组的长度较长的时候使用的是快速排序(QuickSort)。纠正了自己长时间来的一个误区,一直以为sort使用的是冒泡。

3. 取小值插入的方法 

 大概思路:就是同时对两个数组进行遍历,设置两个标志(i,j)用于记录遍历的位置,将两个数组中较小的那个值插入新数组中,接着再将标志往前移动一个位置,重复比较,直到搜索值都插入到数组中。第一次做的时候判断条件写错了,所以出现了死循环,暴露了自己算法能力还是挺薄弱的。     

function con(arrA,arrB){ 
   var i , j , k, lenA = arrA.length, lenB = arrB.length , allLen = lenA + lenB,result = []; 
   for(i=0,j=0,k =0; k < allLen; k++ ){ 
       if(i < lenA &&(j >= lenB || arrA[i] < arrB[j])){ 
           result.push(arrA[i++]);  
       }else{ 
            result.push(arrB[j++]); 
       } 
   } 
   return result; 
} 
var a = [1,2,4], b = [3,5,6,7,10]; 
console.log(con(a,b));  //[1,2,3,4,5,6,7,10]

将这个算法与上面的方法1,在jsperf进行性能对比,发现第二种算法的效率明显优于第一种。不相信就猛击这里。

4.问题升级:增加合并数组的数量

  假如增加数组的个数,;例如 A = [1,5],B = [2,6],C = [3,4].......K = [....],求合并的数组。   

     当时被问到这个问题,第一感觉就是很像”归并算法“,但是又一想使用归并算法是用不上数组有序这个前提条件的。接着又想到了堆排序、快排序等算法,发现就是无法很有效地用上数组有序这个前提条件,最后选择放弃。面试完后依然没有思路,想了好久不知道如何高效的解决这个问题。快回宿舍的时候,师弟说了一句”又要过节了“,”又“字点醒了我,代码如下:   

function conMore(){ 
    var outerArr = [], i ,len = arguments.length , result = []; 
    for(i = 0 ; i<len; i++){ 
        outerArr.push(arguments[i]); 
    } 
    if(result.length === 0){ 
        result = outerArr[0]; 
    } 
    for(i=1 ;i< len; i++){ 
        result = con(result,outerArr[i]); 
    } 
    return result; 
} 
function con(arrA,arrB){ 
   var i , j , k, lenA = arrA.length, lenB = arrB.length , allLen = lenA + lenB,result = []; 
   for(i=0,j=0,k =0; k < allLen; k++ ){ 
       if(i < lenA &&(j >= lenB || arrA[i] < arrB[j])){ 
           result.push(arrA[i++]);  
       }else{ 
            result.push(arrB[j++]); 
       } 
   } 
   return result; 
} 
var a = [1,4,7], b = [2,5,8], c = [3,6,9,10]; 
console.log(conMore(a,b,c));   //[1,2,3,4,5,6,7,8,9,10]

再次使用jsperf对代码的性能进行测试分析,结果请猛击这里.

Javascript 相关文章推荐
只需20行代码就可以写出CSS覆盖率测试脚本
Apr 24 Javascript
Jquery动态更改一张位图的src与Attr的使用
Jul 31 Javascript
jquery实现两个图片渐变切换效果的方法
Jun 25 Javascript
JavaScript正则表达式的分组匹配详解
Feb 13 Javascript
JavaScript 拖拽实例代码
Sep 21 Javascript
angularjs中ng-attr的用法详解
Dec 31 Javascript
Ionic2开发环境搭建教程
Aug 20 Javascript
Vue非父子组件通信详解
Jun 12 Javascript
js读取本地文件的实例
Dec 22 Javascript
js实现图片局部放大效果详解
Mar 18 Javascript
浅谈JS和jQuery的区别
Mar 27 jQuery
JS算法题之查找数字在数组中的索引位置
May 15 Javascript
jquery更换文章内容与改变字体大小代码
Sep 30 #Javascript
jquery配合css简单实现返回顶部效果
Sep 30 #Javascript
jquery提取元素里的纯文本不包含span等里的内容
Sep 30 #Javascript
jquery得到font-size属性值实现代码
Sep 30 #Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
Sep 30 #Javascript
js防止表单重复提交的两种方法
Sep 30 #Javascript
js借助ActiveXObject实现创建文件
Sep 29 #Javascript
You might like
PHP 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
PHP 设置MySQL连接字符集的方法
2011/01/02 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
PHP内核探索:变量存储与类型使用说明
2014/01/30 PHP
Aster vs Newbee BO5 第三场2.19
2021/03/10 DOTA
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
JavaScript页面模板库handlebars的简单用法
2015/03/02 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
微信小程序promsie.all和promise顺序执行
2017/10/27 Javascript
基于jQuery Ajax实现下拉框无刷新联动
2017/12/06 jQuery
微信小程序实现图片预览功能
2018/01/31 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
2020/11/16 Javascript
js动态生成表格(节点操作)
2021/01/12 Javascript
Python中subprocess模块用法实例详解
2015/05/20 Python
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
Pandas中两个dataframe的交集和差集的示例代码
2020/12/13 Python
使用CSS3制作一个简单的进度条(demo)
2017/05/23 HTML / CSS
优秀士兵个人事迹材料
2014/01/19 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
交通事故协议书范文
2014/10/23 职场文书
健康状况证明书
2014/11/26 职场文书
《社戏》教学反思
2016/02/22 职场文书