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 联动日历实现代码
May 31 Javascript
javascript函数以及基础写法100多条实用整理
Jan 13 Javascript
JavaScript日期时间格式化函数分享
May 05 Javascript
JS获取时间的方法
Jan 21 Javascript
在JavaScript中操作时间之setYear()方法的使用
Jun 12 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
May 21 Javascript
浅谈js中调用函数时加不加括号的问题
Jul 28 Javascript
AngularJS 单元测试(二)详解
Sep 21 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
Feb 18 Javascript
AngularJS使用拦截器实现的loading功能完整实例
May 17 Javascript
vue+element实现批量删除功能的示例
Feb 28 Javascript
JavaScript面向对象程序设计创建对象的方法分析
Aug 13 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生成静态页面的简单示例
2014/04/17 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
ThinkPHP中Session用法详解
2014/11/29 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
Js event事件在IE、FF兼容性问题
2011/01/01 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
两种不同的方法实现js对checkbox进行全选和反选
2014/05/13 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
jQuery弹出层插件popShow(改进版)用法示例
2017/01/23 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
Python完全新手教程
2007/02/08 Python
Python深入学习之内存管理
2014/08/31 Python
python中常用的九种预处理方法分享
2016/09/11 Python
Python2与Python3的区别点整理
2019/12/12 Python
python中count函数简单用法
2020/01/05 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
韩国三星旗下的一家超市连锁店:Home Plus
2016/07/30 全球购物
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
Ajax的优点和缺点
2014/11/21 面试题
介绍一下mysql的日期和时间函数
2013/03/28 面试题
应聘美工求职信
2013/11/07 职场文书
上班玩手机检讨书
2014/02/17 职场文书
2014年客房部工作总结
2014/11/22 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
付款证明格式范文
2015/06/19 职场文书
PyQt5 显示超清高分辨率图片的方法
2021/04/11 Python
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA