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 相关文章推荐
将jQuery应用于login页面的问题及解决
Oct 17 Javascript
javascipt匹配单行和多行注释的正则表达式
Nov 20 Javascript
jQuery实现宽屏图片轮播实例教程
Nov 24 Javascript
JQuery ztree带筛选、异步加载实例讲解
Feb 25 Javascript
完美JQuery图片切换效果的简单实现
Jul 21 Javascript
jquery attr()设置和获取属性值实例教程
Sep 25 Javascript
详解angular中通过$location获取路径(参数)的写法
Mar 21 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
Mar 06 Javascript
Vue表单类的父子组件数据传递示例
May 03 Javascript
vue中el-upload上传图片到七牛的示例代码
Oct 19 Javascript
layui禁用侧边导航栏点击事件的解决方法
Sep 25 Javascript
JavaScript实现拖拽和缩放效果
Aug 24 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
ThinkPHP实现事务回滚示例代码
2014/06/23 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
Document 对象的常用方法
2009/07/31 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
Js中获取frames中的元素示例代码
2013/07/30 Javascript
jquery 提示信息显示后自动消失的具体实现
2013/12/18 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
2014/10/17 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
原生js仿淘宝网商品放大镜效果
2017/02/28 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
python实现中文输出的两种方法
2015/05/09 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
使用python实现个性化词云的方法
2017/06/16 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
函数指针的定义是什么
2016/08/14 面试题
物流仓储实习自我鉴定
2013/09/25 职场文书
婚假请假条怎么写
2014/04/10 职场文书
企业挂职心得体会
2014/09/10 职场文书
终止劳动合同协议书
2014/10/05 职场文书
保护环境建议书作文400字
2015/09/14 职场文书