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获取GridView中用户点击控件的行号,列号
Apr 14 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
May 19 Javascript
当鼠标移动时出现特效的JQuery代码
Nov 08 Javascript
jQuery截取指定长度字符串的实现原理及代码
Jul 01 Javascript
js实现按钮控制图片360度翻转特效的方法
Feb 17 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
Dec 01 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
Feb 17 Javascript
省市联动效果的简单实现代码(推荐)
Jun 06 Javascript
微信小程序时间标签和时间范围的联动效果
Feb 15 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
Jun 11 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
Feb 10 Javascript
Vue-Element-Admin集成自己的接口实现登录跳转
Jun 23 Vue.js
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将XML转数组过程详解
2013/11/13 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
详解PHP如何更好的利用PHPstorm的自动提示
2017/08/18 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
js判断变量是否空值的代码
2008/10/26 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
详解vue axios用post提交的数据格式
2018/08/07 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
python 为什么说eval要慎用
2019/03/26 Python
Python调用graphviz绘制结构化图形网络示例
2019/11/22 Python
pytorch模型存储的2种实现方法
2020/02/14 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
X/HTML5 和 XHTML2
2008/10/17 HTML / CSS
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
茶叶生产计划书
2014/01/10 职场文书
校园文化建设方案
2014/02/03 职场文书
公司端午节活动方案
2014/02/04 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
推普周活动总结
2014/08/28 职场文书
先进人物事迹材料
2014/12/29 职场文书
工程部文员岗位职责
2015/02/04 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
实施意见格式范本
2015/06/05 职场文书
校运会通讯稿
2015/07/18 职场文书
MySQL8.0.18配置多主一从
2021/06/21 MySQL
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server