2012-11-26 47 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),它从你的阵列采取“数字”混合基数表示写下来 - 只需要两个嵌套循环。