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 相关文章推荐
XML+XSL 与 HTML 两种方案的结合
Apr 22 Javascript
js截取中英文字符串、标点符号无乱码示例解读
Apr 17 Javascript
全面兼容的javascript时间格式化函数(比较实用)
May 14 Javascript
JavaScript中的原型和继承详解(图文)
Jul 18 Javascript
jQuery+css实现百度百科的页面导航效果
Dec 16 Javascript
Javascript中使用parseInt函数需要注意的问题
Apr 02 Javascript
全面解析Bootstrap中transition、affix的使用方法
May 30 Javascript
javascript实现文字无缝滚动
Dec 27 Javascript
jQuery插件zTree实现获取一级节点数据的方法
Mar 08 Javascript
js获取html页面代码中图片地址的实现代码
Mar 05 Javascript
jQuery实现的老虎机跑动效果示例
Dec 29 jQuery
element-ui 实现响应式导航栏的示例代码
May 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
关于PHP语言构造器介绍
2013/07/08 PHP
php实现mysql事务处理的方法
2014/12/25 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
thinkphp5使html5实现动态跳转的例子
2019/10/16 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
jQuery Ajax之load()方法
2009/10/12 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
javascript实现校验文件上传控件实例
2015/04/20 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
2015/06/19 Javascript
JSONP跨域请求
2017/03/02 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
Angular.js中上传指令ng-upload的基本使用教程
2017/07/30 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
JS实现炫酷轮播图
2020/11/15 Javascript
[06:37]2014DOTA2国际邀请赛 昔日王者渴望重回巅峰
2014/07/12 DOTA
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python pandas常用函数详解
2018/02/07 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
html5的canvas方法使用指南
2014/12/15 HTML / CSS
护理专业毕业生自我鉴定
2013/10/08 职场文书
房地产管理毕业生自荐信
2013/11/04 职场文书
商务英语专业求职信
2014/06/26 职场文书
数学教师个人总结
2015/02/06 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python
Nginx安装配置详解
2022/06/25 Servers