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 相关文章推荐
NiftyCube——轻松实现圆角边框
Feb 20 Javascript
登陆成功后自动计算秒数执行跳转
Jan 23 Javascript
js的延迟执行问题分析
Jun 23 Javascript
jQuery实现根据类型自动显示和隐藏表单
Mar 18 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
May 06 Javascript
jQuery中slidedown与slideup方法用法示例
Sep 16 Javascript
JS针对Array的各种操作汇总
Nov 29 Javascript
详解Vue使用命令行搭建单页面应用
May 24 Javascript
微信小程序实现人脸识别
May 25 Javascript
vue+springmvc导出excel数据的实现代码
Jun 27 Javascript
微信小程序整合使用富文本编辑器的方法详解
Apr 25 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
Sep 24 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面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
PHP教程 基本语法
2009/10/23 PHP
Smarty分页实现方法完整实例
2016/05/11 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
UserData用法总结 lanyu出品
2010/07/01 Javascript
jquery中子元素和后代元素的区别示例介绍
2014/04/02 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
基于Vant UI框架实现时间段选择器
2020/12/24 Javascript
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
python Pandas如何对数据集随机抽样
2019/07/29 Python
Python 使用list和tuple+条件判断详解
2019/07/30 Python
Python流程控制 while循环实现解析
2019/09/02 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
2019史上最全Database工程师题库
2015/12/06 面试题
大专计算机个人求职的自我评价
2013/10/21 职场文书
数学专业毕业生自荐信
2013/11/10 职场文书
内衣营销方案
2014/03/15 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
三月雷锋月活动总结
2014/07/03 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
PHP使用非对称加密算法RSA
2021/04/21 PHP