最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js有序數(shù)組的連接問題

 更新時(shí)間:2013年10月01日 13:56:56   作者:  
昨天碰到一道關(guān)于如何解決有序數(shù)組的連接問題,這是一個(gè)很常見的問題。但是這里要考慮到代碼的效率問題,因?yàn)橐B接的數(shù)組都是有序的,這是一個(gè)非常重要的前提條件

1.前言 

昨天碰到一道關(guān)于如何解決有序數(shù)組的連接問題,這是一個(gè)很常見的問題。但是這里要考慮到代碼的效率問題,因?yàn)橐B接的數(shù)組都是有序的,這是一個(gè)非常重要的前提條件。

2.簡單但效率不高的算法 

 我首先想到的是使用內(nèi)置的concat方法,然后再對其進(jìn)行排序,這種方法完全沒有考慮到數(shù)組是有序的前提條件,代碼如下:    

復(fù)制代碼 代碼如下:

function concatSort(arrA,arrB){
     return arrA.concat(arrB).sort();
}

  為了弄清楚sort排序到底使用的是什么算法,特地到看了V8引擎的算法(連接),大概意思是當(dāng)數(shù)組的長度較短的時(shí)候使用的是插入排序(InsertionSort),當(dāng)數(shù)組的長度較長的時(shí)候使用的是快速排序(QuickSort)。糾正了自己長時(shí)間來的一個(gè)誤區(qū),一直以為sort使用的是冒泡。

3. 取小值插入的方法 

 大概思路:就是同時(shí)對兩個(gè)數(shù)組進(jìn)行遍歷,設(shè)置兩個(gè)標(biāo)志(i,j)用于記錄遍歷的位置,將兩個(gè)數(shù)組中較小的那個(gè)值插入新數(shù)組中,接著再將標(biāo)志往前移動(dòng)一個(gè)位置,重復(fù)比較,直到搜索值都插入到數(shù)組中。第一次做的時(shí)候判斷條件寫錯(cuò)了,所以出現(xiàn)了死循環(huán),暴露了自己算法能力還是挺薄弱的。     

復(fù)制代碼 代碼如下:

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]

  將這個(gè)算法與上面的方法1,在jsperf進(jìn)行性能對比,發(fā)現(xiàn)第二種算法的效率明顯優(yōu)于第一種。不相信就猛擊這里。

4.問題升級(jí):增加合并數(shù)組的數(shù)量

  假如增加數(shù)組的個(gè)數(shù),;例如 A = [1,5],B = [2,6],C = [3,4].......K = [....],求合并的數(shù)組。   

     當(dāng)時(shí)被問到這個(gè)問題,第一感覺就是很像”歸并算法“,但是又一想使用歸并算法是用不上數(shù)組有序這個(gè)前提條件的。接著又想到了堆排序、快排序等算法,發(fā)現(xiàn)就是無法很有效地用上數(shù)組有序這個(gè)前提條件,最后選擇放棄。面試完后依然沒有思路,想了好久不知道如何高效的解決這個(gè)問題??旎厮奚岬臅r(shí)候,師弟說了一句”又要過節(jié)了“,”又“字點(diǎn)醒了我,代碼如下:   

復(fù)制代碼 代碼如下:

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對代碼的性能進(jìn)行測試分析,結(jié)果請猛擊這里.

相關(guān)文章

  • javascript title閃動(dòng)效果

    javascript title閃動(dòng)效果

    title漂亮的閃動(dòng)效果
    2008-10-10
  • JavaScript的9個(gè)陷阱及評點(diǎn)分析

    JavaScript的9個(gè)陷阱及評點(diǎn)分析

    以下是JavaScript容易犯錯(cuò)的九個(gè)陷阱。雖然不是什么很高深的技術(shù)問題,但注意一下,會(huì)使您的編程輕松些,即所謂make life easier. 筆者對某些陷阱會(huì)混雜一些評點(diǎn)。
    2008-05-05
  • JavaScript中定時(shí)控制Throttle、Debounce和Immediate詳解

    JavaScript中定時(shí)控制Throttle、Debounce和Immediate詳解

    大家可能都知道JavaScript遵循事件驅(qū)動(dòng)的編程范例,這意味著一些行為可以激活一些響應(yīng),并且這些響應(yīng)僅在發(fā)生特定的行為時(shí)才被激活。這篇文章將給大家詳細(xì)介紹JavaScript中的定時(shí)控制Throttle、Debounce和Immediate,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-11-11
  • 利用pixi.js制作簡單的跑酷小游戲

    利用pixi.js制作簡單的跑酷小游戲

    PixiJS 提供一個(gè)適用于所有設(shè)備的快速輕量級(jí) 2D 庫。PixiJS 具有完整的 WebGL 支持,并且可以無縫地回退到 HTML5 的畫布。 本文將使用pixi.js制作簡單的跑酷小游戲,感興趣的可以嘗試一下
    2022-07-07
  • javascript 中的try catch應(yīng)用總結(jié)

    javascript 中的try catch應(yīng)用總結(jié)

    這篇文章主要介紹了javascript 中的try catch應(yīng)用總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • JavaScript動(dòng)畫實(shí)例之粒子文本的實(shí)現(xiàn)方法詳解

    JavaScript動(dòng)畫實(shí)例之粒子文本的實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了JavaScript動(dòng)畫實(shí)例之粒子文本的實(shí)現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • javascript 使用sleep函數(shù)的常見方法詳解

    javascript 使用sleep函數(shù)的常見方法詳解

    這篇文章主要介紹了javascript 使用sleep函數(shù)的常見方法,結(jié)合實(shí)例形式分析總結(jié)了javascript sleep函數(shù)的功能、常見使用方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • ES6學(xué)習(xí)筆記之Set和Map數(shù)據(jù)結(jié)構(gòu)詳解

    ES6學(xué)習(xí)筆記之Set和Map數(shù)據(jù)結(jié)構(gòu)詳解

    這篇文章主要介紹了ES6學(xué)習(xí)筆記之Set和Map數(shù)據(jù)結(jié)構(gòu),結(jié)合實(shí)例形式詳細(xì)分析了ECMAScript中基本數(shù)據(jù)結(jié)構(gòu)Set和Map的常用屬性與方法的功能、用法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-04-04
  • JavaScript DOM事件(筆記)

    JavaScript DOM事件(筆記)

    這篇文章主要介紹了JavaScript DOM事件(筆記) ,需要的朋友可以參考下
    2015-04-04
  • javascript 流暢動(dòng)畫實(shí)現(xiàn)原理

    javascript 流暢動(dòng)畫實(shí)現(xiàn)原理

    瀏覽器目前來說是沒有抗鋸齒效果的(將來不一定哦),這樣dom元素外觀的改變就被限制在1個(gè)像素為最佳效果。

    2009-09-09

最新評論

孟村| 建阳市| 闵行区| 舒兰市| 莱州市| 岳普湖县| 宁海县| 兴安县| 镇安县| 台中县| 西城区| 普定县| 南康市| 庆安县| 拉萨市| 兴海县| 罗田县| 丰镇市| 遵义市| 安新县| 弥勒县| 象山县| 潞西市| 怀柔区| 余姚市| 永城市| 浦北县| 长白| 古田县| 门源| 全南县| 建宁县| 资中县| 文昌市| 开阳县| 施甸县| 大名县| 怀柔区| 视频| 靖宇县| 安新县|