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 语法集锦 脚本之家基础推荐
Nov 15 Javascript
JavaScript 高效运行代码分析
Mar 18 Javascript
Javascript加载速度慢的解决方案
Mar 11 Javascript
移动端js图片查看器
Nov 17 Javascript
jquery利用json实现页面之间传值的实例解析
Dec 12 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
Mar 02 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
Jun 09 jQuery
JS通过调用微信API实现微信支付功能的方法示例
Jun 29 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
Jan 10 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
Nov 11 Javascript
详解基于Vue的支持数据双向绑定的select组件
Sep 02 Javascript
vue实现抖音时间转盘
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
全国FM电台频率大全 - 19 广东省
2020/03/11 无线电
中国收音机工业发展史
2021/03/02 无线电
php session安全问题分析
2011/06/24 PHP
PHP中的常见魔术方法功能作用及用法实例
2015/07/01 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
JavaScript 全面解析各种浏览器网页中的JS 执行顺序
2009/02/17 Javascript
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
AngularJS基础 ng-mousemove 指令简单示例
2016/08/02 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
Angular2进阶之如何避免Dom误区
2018/04/02 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
2018/10/12 Javascript
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
PYTHON正则表达式 re模块使用说明
2011/05/19 Python
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
建筑设计学生的自我评价
2014/01/16 职场文书
社区活动邀请函范文
2014/01/29 职场文书
道德之星事迹材料
2014/05/03 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
推荐信模板
2014/05/09 职场文书
年终晚会活动方案
2014/08/21 职场文书
新闻简讯格式及范文
2015/07/22 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
python中 Flask Web 表单的使用方法
2022/05/20 Python