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]

開始配列の数はさまざまです。

4

5 に答える 5

3

言語にもよりますが、正式にはこのようなものです(指定したとおりに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
于 2012-11-26T13:51:38.640 に答える
1

あなたが考えることができる最も単純なアルゴリズムは、あなたが持つことができる最高のものです。答えはすべての配列の次元を掛け合わせたサイズであるため、ここではあまり改善できません。個人的には再帰を使用することをお勧めします。結果として得られる配列の数を非常に大きくしない限り、配列の数を大きくしすぎることはできないからです。

于 2012-11-26T13:51:44.993 に答える
1

それぞれ n 1、 n 2 ... n k要素の k 配列があるとします。
すべての組み合わせを記述することは、すべての数値を混合基数で記述することに非常に似ています。
したがって、0 から (n 1 n 2 ...n k -1) までのすべての可能な数値を単純にループし、配列から取得した「数字」を使用して混合基数表現で書き留めます。必要なネストされたループは 2 つだけです。

于 2012-11-26T16:03:12.983 に答える
0

もう 1 つの方法はグラフィカルな方法です。元のセットから始めて、そのコンテンツを時計回りに移動し、組み合わせを保存します。例 最初に最後の行を回転させ、最後の回転の後に最後の - 1 行を移動します (この場合は 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: 常に各配列の最初の要素のみを保存します。

于 2012-11-26T14:35:24.133 に答える