2012-11-26 52 views
1

項的所有組合比方說,這些都是啓動陣列:如何找到多個陣列

[a,b,c] 
[d] 
[e,f] 

什麼算法可以產生以下數組?

[a,d,e] 
[a,d,f] 
[b,d,e] 
[b,d,f] 
[c,d,e] 
[c,d,f] 

啓動數組的數量可能會有所不同。

+2

它被稱爲[笛卡爾積](http://en.wikipedia.org/wiki/Cartesian_product),但沒有太多的算法,只需遍歷嵌套循環中的所有集合(如果數字的集合是固定的並且事先已知)或者使用遞歸。 – biziclop

回答

2

取決於語言,但正式這樣的事情(如你指定的時候,你有3個陣列)

for el1 in first_array do 
    for el2 in second_array do 
    for el3 in third_array do 
     begin 
     create new element in result array as [e1, el2, el3] 
     end 
+1

簡單是最好的解決方案:) –

1

你能想到的最簡單的算法是,你可以有最好的。由於答案的大小,所有這些數組的乘數維度可以在這裏做出很大的改進。我個人建議使用遞歸,因爲數組的數量不能太大,而不會使得結果數組的數量真的很大。

0

另一種方法是圖形化方法,您從原始集合開始,順時針移動其內容並存儲組合。示例首先旋轉最後一行,並在最後一次旋轉後移動最後一行(本例中爲d,但不能旋轉它),因此您將旋轉第一行。這就像二進制和。

[a,b,c]  [a,b,c]---->[b,c,a]  [b,c,a]---->[c,a,b]  [c,a,b]    
[d]   [d]   [d]   [d]   [d]   [d]  
[e,f]------>[f,e]------>[e,f]------>[f,e]------>[e,f]------>[f,e] 

PD:你只能保存每個陣列永遠是第一要素。

0

讓有分別ķ陣列Ñ,正 ... N ķ元件。
編寫所有組合非常喜歡在mixed radix中編寫所有數字。
所以,簡單地遍歷所有可能的數字從0到(N ň ... N ķ -1),它從你的陣列採取「數字」混合基數表示寫下來 - 只需要兩個嵌套循環。