多個陣列的組合排序演算法

2022-03-06 15:37:36 字數 4065 閱讀 9323

一,聊騷:

我是乙個喜歡直奔主題的人,不喜歡把時間浪費到廢話上,因為這也是在浪費讀者到時間,那為什麼我今天一反常態,要說點聊騷的話呢?

緣由是這樣的,作為乙個自學成才(其實還沒有成才)的前端人員來說,前端之路是多麼的坎坷,面對大量的前端知識,面對如雨後春筍般的前端框架的興起,面對nodejs在前端與後端之間的連線的應用,

此時的前端再也不是幾年前的那個前端了,有太多的框架要去學,有太多的前端知識要去研究,學習,這樣難免會讓人失去方向,學的東西也很雜,為了適應現在的對前端人員的要求,你就不得不撒開網去

探索,導致的結果就是,你好像什麼都接觸過,感覺什麼都懂,但是如果要你說出乙個所以然來,好像又什麼都不懂,這才是前端學習最可怕的,浮於表面,沒有真正深入了解其中的原理,有人會說,現在的技術學習曲線那麼陡,要學的知識那麼多,哪有那麼多時間去學呢?

回答這個問題,我得先說,我失業了,就如同我前面說的一樣,我只是浮於表面,沒有真正沉下去,那怎麼才能學好技術呢?根據牛人的指導,大致是在技術選型上,選擇適合自己的,比如說前端框架,angularjs,reactjs,backbonejs,vuejs等等,選擇乙個自己覺得比較好上手的,然後搭配乙個打包工具,比如webpack,gulp,grunt等等,多去深入理解它的實現原理,編寫的思想,總之,多看,

多寫(這才是重點),多研究,然後把自己的心得感悟,以筆記或者部落格的形式記錄下來,讓牛人們幫你噴噴,這樣既可以加深印象,還可以和牛人一起學習,算了,不說了,這其實是寫給我看的。

二,正題:

言歸正傳,今天我們要講的是乙個什麼命題呢?

命題:多維陣列的排列組合 或 多個陣列之間的排列組合

命題場景:

現在有一批手機,其中顏色有['白色','黑色','金色'];記憶體大小有['16g','32g','64g'],版本有['移動','聯通','電信'],要求寫乙個演算法,實現[['白色','16g','移動'], ['白色','16g','聯通'] ...]這樣的組合,擴張,如果後面還有引數,比如再加乙個['國行','港版'],不改程式一樣可以執行!

最後得到的結果是乙個陣列裡面包含若干個陣列,看著挺複雜的,我們先實現乙個簡化版的,陣列裡面不是陣列,而是字串連線的結果,嗯,先一步步來吧:

第一步,想想通過什麼技術來實現,你看這陣列之間不斷的重組,很容易想到用**函式,一遍一遍的執行,大致知道用什麼技術,接下來就是寫思路了,看看下面:

//

執行組合排列的函式

function

doexchange(arr)

//執行

var arr = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z']];

var arr1 = [['a','b','c']];

//doexchange(arr);

console.log(doexchange(arr));

吶,我們建乙個函式doexchange(),表示我們執行排序的主函式,然後當執行arr的時候,輸出['a1x','a1y' ...]這樣的結果,如果是arr1呢?我們需要輸出['a','b','c'],這好理解哈,現在的重點就是這個主函式了,下面主要講主函式的實現過程

//

執行組合排列的函式

function

doexchange(arr)

else

}

我們的思路是,當引數裡面的陣列長度大於2個,比如2個,3個或更多,就執行我們的組合**,否則只有乙個,就直接輸出來唄

如果是大於2個呢?我們的思路是先進行第乙個和第二個的合併,網上有一種實現方式是,用多層for迴圈來巢狀,最終得到組合的值,這種估計大家也能感覺到,兩三個還可以,多了就呵呵了,這裡只是提一下,因為前兩個比較好獲取,合併之後呢,就相當於是

2個陣列合併成乙個陣列,然後這個陣列再放倒引數陣列中第乙個位置,把原來前兩個去掉,相當於是用這個陣列替換前兩個,沒聽懂哈,沒關係,我們直接看**:

if(len >= 2)}}

吶,這裡我們先獲取第乙個和第二個陣列的長度,然後計算出它們有多少種組合方式,然後新建乙個暫存的陣列,用來存我們組合得到的結果,後面就是用雙層迴圈,做字串連線,放到暫存陣列中,沒什麼好說的

我們的到了前兩個的組合結果,依據我們的思路,是要把它和原來陣列合併成乙個新陣列

//

第乙個陣列的長度

var len1 = arr[0].length;

//第二個陣列的長度

var len2 = arr[1].length;

//2個陣列產生的組合數

var lenboth = len1 *len2;

//申明乙個新陣列,做資料暫存

var items = new

array(lenboth);

//申明新陣列的索引

var index = 0;

//2層巢狀迴圈,將組合放到新陣列中

for(var i=0; i)

}//將新組合的陣列並到原陣列中

var newarr = new array(len -1);

for(var i=2;i)

newarr[0] = items;

整體的思路就是這樣,得到的新陣列就是剩下的未組合的陣列了,到這裡大家應該就豁然開朗了,然後使用遞迴再次呼叫這個過程,這樣不斷組合成新陣列,那這個新陣列當引數時,如果陣列的長度等於1了,就說明組合完了,就會執行後面的else語句,輸出出來。

整體**貼出來感受一下:

//

執行組合排列的函式

function

doexchange(arr)

}//將新組合的陣列並到原陣列中

var newarr = new array(len -1);

for(var i=2;i)

newarr[0] =items;

//執行**

return

doexchange(newarr);

}else

}//執行

我們簡化版的組合算是完成了,可能也會有類似的需求,但是我們今天要講的不是這樣的需求,而是裡面的每乙個組合要是乙個陣列,這個怎麼實現呢?

突破點應該就在字串連線那塊了,原來是用的字串連線,如果我們改成陣列連線,不就行了嗎?試試:

for(var i=0; i)

else

index++;}}

其他地方都沒有改,就只是改了這裡,但是這裡第一次是要做陣列判斷的,因為剛開始是字串,要轉換成陣列才能連線,這裡注意一下,最終的**如下:

function

doexchange(arr)

else

index++;}}

var newarr = new array(len -1);

for(var i=2;i)

newarr[0] =items;

return

doexchange(newarr);

}else

}//var arr = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z'],['手機']];

var arr1 = [['a','b','c']];

console.log(doexchange(arr));

得到的結果:

我後面又加了乙個手機,同樣是可以實現的,到這裡就算死寫完了。

三,總結:

給個總結吧,這個演算法剛開始想想,感覺挺複雜的,這麼多陣列要排列組合,但是我們將它化繁為簡,比如說就當只有2個陣列的組合,是不是就簡單多了,這個實現了,然後考慮多組的,這樣世界就清靜了!還是那句話,還是多寫吧!

組合多個陣列

function joinresult result,main key result key value key arr a1 array array 0 1 org id 10 new customers 100 new orders 100 array 0 2 org id 20 new cus...

演算法 多個無序陣列合併排序

思路1 先單獨排序,再合併 注意 sorted函式是又返回值的,不改變原來list,注意 若是多個陣列,則可以對其中所有第乙個數進行再排序 def sort1 list1,list2 list1 sorted list1 list2 sorted list2 res while len list1 ...

python 多個陣列內資料之間的組合

如圖,最近想實現乙個小功能 多個陣列中,資料之間的組合。絞盡腦汁,無論多少個陣列,想用乙個函式來解決這個問題。a 1 2,3 4,6 b 12 13,14 15,16 c 22 23,24 25,26 a a,b,c defgetplans lis,jude true if jude lis i f...