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实现依次输入input自动定焦
Dec 23 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
Jan 06 Javascript
非常漂亮的相册集 使用jquery制作相册集
Apr 28 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
Dec 12 Javascript
Vue2.0表单校验组件vee-validate的使用详解
May 02 Javascript
vue v-model表单控件绑定详解
May 17 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
Nov 19 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
Nov 28 Javascript
如何用RxJS实现Redux Form
Dec 29 Javascript
JS函数节流和防抖之间的区分和实现详解
Jan 11 Javascript
重学JS 系列:聊聊继承(推荐)
Apr 11 Javascript
iview实现动态表单和自定义验证时间段重叠
Jan 10 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脚本代码
2011/02/19 PHP
PHP中cookie和session的区别实例分析
2014/08/28 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
2017/04/12 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
vue实现可视化可拖放的自定义表单的示例代码
2019/03/20 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
Python标准库之sqlite3使用实例
2014/11/25 Python
Cpy和Python的效率对比
2015/03/20 Python
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
详解python 发送邮件实例代码
2016/12/22 Python
python批量替换页眉页脚实例代码
2018/01/22 Python
详解python多线程、锁、event事件机制的简单使用
2018/04/27 Python
使用tensorflow实现线性回归
2018/09/08 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
利用Python实现kNN算法的代码
2019/08/16 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
iPad和Surface Pro蓝牙键盘:Brydge
2018/11/10 全球购物
波兰灯具、照明和LED购物网站:Lampy.pl
2019/03/11 全球购物
日本语毕业生自荐信
2014/02/01 职场文书
艺校音乐专业自我鉴定范文
2014/03/01 职场文书
班组长岗位职责
2014/03/03 职场文书
学习十八大坚定理想信念心得体会
2014/03/11 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
2015初中政教处工作总结
2015/07/21 职场文书