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 相关文章推荐
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
Aug 15 Javascript
js function使用心得
May 10 Javascript
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
Jun 02 Javascript
js有关元素内容操作小结
Dec 20 Javascript
extjs表格文本启用选择复制功能具体实现
Oct 11 Javascript
ExtJS4中的requires使用方法示例介绍
Dec 03 Javascript
jquery 淡入淡出效果的简单实现
Feb 07 Javascript
JavaScript数据类型详解
Apr 01 Javascript
jQuery ajax请求struts action实现异步刷新
Apr 19 jQuery
怎样使你的 JavaScript 代码简单易读(推荐)
Apr 16 Javascript
layui点击按钮页面会自动刷新的解决方案
Oct 25 Javascript
如何区分vue中的v-show 与 v-if
Sep 08 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(3)
2006/10/09 PHP
adodb与adodb_lite之比较
2006/12/31 PHP
PHP文件上传实例详解!!!
2007/01/02 PHP
深入PHP内存相关的功能特性详解
2013/06/08 PHP
php使用mkdir创建多级目录入门例子
2014/05/10 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
js get和post请求实现代码解析
2020/02/06 Javascript
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
python验证码识别的实例详解
2016/09/09 Python
Python分析学校四六级过关情况
2017/11/22 Python
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
CSS3感应鼠标的背景闪烁和图片缩放动画效果
2014/05/14 HTML / CSS
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
说明书格式及范文
2014/05/07 职场文书
宣传活动总结范文
2014/07/01 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
600字作文之感受大自然
2019/11/27 职场文书