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 相关文章推荐
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
Jul 26 Javascript
jquery实现文本框数量加减功能的例子分享
May 10 Javascript
jQuery/CSS3图片特效插件整理推荐
Dec 07 Javascript
浅谈 javascript 事件处理
Jan 04 Javascript
完美实现仿QQ空间评论回复特效
May 06 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
Jan 22 Javascript
JS实现购物车特效
Feb 02 Javascript
AngularJS select设置默认值的实现方法
Aug 25 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
Oct 25 Javascript
JS运动特效之链式运动分析
Jan 24 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
Jun 14 Javascript
微信小程序从注册账号到上架(图文详解)
Jul 17 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
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
PHP使用PHPexcel导入导出数据的方法
2015/11/14 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
javascript 节点遍历函数
2010/03/28 Javascript
javascript 得到变量类型的函数
2010/05/19 Javascript
js操作时间(年-月-日 时-分-秒 星期几)
2010/06/20 Javascript
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
2015/03/15 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
2018/05/16 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
vue点击标签切换选中及互相排斥操作
2020/07/17 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
Python使用itertools模块实现排列组合功能示例
2018/07/02 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
详细分析Python collections工具库
2020/07/16 Python
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
植村秀加拿大官网:Shu Uemura加拿大
2019/09/03 全球购物
班组长工作职责
2013/12/25 职场文书
创建服务型党组织实施方案
2014/02/25 职场文书
优秀毕业生就业推荐信
2014/05/22 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL