js有序數(shù)組的連接問(wèn)題
1.前言
昨天碰到一道關(guān)于如何解決有序數(shù)組的連接問(wèn)題,這是一個(gè)很常見(jiàn)的問(wèn)題。但是這里要考慮到代碼的效率問(wèn)題,因?yàn)橐B接的數(shù)組都是有序的,這是一個(gè)非常重要的前提條件。
2.簡(jiǎn)單但效率不高的算法
我首先想到的是使用內(nèi)置的concat方法,然后再對(duì)其進(jìn)行排序,這種方法完全沒(méi)有考慮到數(shù)組是有序的前提條件,代碼如下:
function concatSort(arrA,arrB){
return arrA.concat(arrB).sort();
}
為了弄清楚sort排序到底使用的是什么算法,特地到看了V8引擎的算法(連接),大概意思是當(dāng)數(shù)組的長(zhǎng)度較短的時(shí)候使用的是插入排序(InsertionSort),當(dāng)數(shù)組的長(zhǎng)度較長(zhǎng)的時(shí)候使用的是快速排序(QuickSort)。糾正了自己長(zhǎng)時(shí)間來(lái)的一個(gè)誤區(qū),一直以為sort使用的是冒泡。
3. 取小值插入的方法
大概思路:就是同時(shí)對(duì)兩個(gè)數(shù)組進(jìn)行遍歷,設(shè)置兩個(gè)標(biāo)志(i,j)用于記錄遍歷的位置,將兩個(gè)數(shù)組中較小的那個(gè)值插入新數(shù)組中,接著再將標(biāo)志往前移動(dòng)一個(gè)位置,重復(fù)比較,直到搜索值都插入到數(shù)組中。第一次做的時(shí)候判斷條件寫(xiě)錯(cuò)了,所以出現(xiàn)了死循環(huán),暴露了自己算法能力還是挺薄弱的。
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)行性能對(duì)比,發(fā)現(xiàn)第二種算法的效率明顯優(yōu)于第一種。不相信就猛擊這里。
4.問(wèn)題升級(jí):增加合并數(shù)組的數(shù)量
假如增加數(shù)組的個(gè)數(shù),;例如 A = [1,5],B = [2,6],C = [3,4].......K = [....],求合并的數(shù)組。
當(dāng)時(shí)被問(wèn)到這個(gè)問(wèn)題,第一感覺(jué)就是很像”歸并算法“,但是又一想使用歸并算法是用不上數(shù)組有序這個(gè)前提條件的。接著又想到了堆排序、快排序等算法,發(fā)現(xiàn)就是無(wú)法很有效地用上數(shù)組有序這個(gè)前提條件,最后選擇放棄。面試完后依然沒(méi)有思路,想了好久不知道如何高效的解決這個(gè)問(wèn)題??旎厮奚岬臅r(shí)候,師弟說(shuō)了一句”又要過(guò)節(jié)了“,”又“字點(diǎn)醒了我,代碼如下:
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對(duì)代碼的性能進(jìn)行測(cè)試分析,結(jié)果請(qǐng)猛擊這里.
- 歸并算法之有序數(shù)組合并算法實(shí)現(xiàn)
- java實(shí)現(xiàn)向有序數(shù)組中插入一個(gè)元素實(shí)例
- php實(shí)現(xiàn)有序數(shù)組打印或排序的方法【附Python、C及Go語(yǔ)言實(shí)現(xiàn)代碼】
- Python實(shí)現(xiàn)二維有序數(shù)組查找的方法
- php判斷一個(gè)數(shù)組是否為有序的方法
- C語(yǔ)言實(shí)現(xiàn)在數(shù)組A上有序合并數(shù)組B的方法
- 用遞歸查找有序二維數(shù)組的方法詳解
- javascript 折半查找字符在數(shù)組中的位置(有序列表)
- 合并有序數(shù)組的實(shí)現(xiàn)(java與C語(yǔ)言)
相關(guān)文章
詳解小程序開(kāi)發(fā)經(jīng)驗(yàn):多頁(yè)面數(shù)據(jù)同步
這篇文章主要介紹了小程序開(kāi)發(fā)經(jīng)驗(yàn):多頁(yè)面數(shù)據(jù)同步,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05javascript中style.left和offsetLeft的用法說(shuō)明
本篇文章主要是對(duì)javascript中style.left和offsetLeft的用法進(jìn)行了說(shuō)明介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-03-03javascript中字符串替換函數(shù)replace()方法與c# 、vb 替換有一點(diǎn)不同
JavaScript 不像和c# vb.net 中一樣 直接就可以替換所以的要替換的字符2010-06-06微信小程序項(xiàng)目總結(jié)之記賬小程序功能的實(shí)現(xiàn)(包括后端)
這篇文章主要介紹了微信小程序項(xiàng)目總結(jié)之記賬小程序功能的實(shí)現(xiàn)方法(包括后端),需要的朋友可以參考下2019-08-08微信小程序中的canvas 文字?jǐn)嘈泻褪÷蕴?hào)顯示功能的處理方法
大家都知道在canvas中沒(méi)有提供方法來(lái)處理文字的多行問(wèn)題,只有通過(guò)截取指定字符串來(lái)達(dá)到目的。接下來(lái)通過(guò)本文給大家介紹微信小程序中的canvas 文字?jǐn)嘈泻褪÷蕴?hào)顯示功能 ,需要的朋友可以參考下2018-11-11jquery ajax應(yīng)用中iframe自適應(yīng)高度問(wèn)題解決方法
很多管理系統(tǒng)中,都使用iframe進(jìn)行信息內(nèi)容的展示方式,或者作為主菜單的鏈接展示內(nèi)容。使用iframe的問(wèn)題就是自適應(yīng)高度的問(wèn)題2014-04-04