これらが開始配列であるとしましょう:
[a,b,c]
[d]
[e,f]
次の配列を生成できるアルゴリズムはどれですか?
[a,d,e]
[a,d,f]
[b,d,e]
[b,d,f]
[c,d,e]
[c,d,f]
開始配列の数はさまざまです。
言語にもよりますが、正式にはこのようなものです(指定したとおりに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
あなたが考えることができる最も単純なアルゴリズムは、あなたが持つことができる最高のものです。答えはすべての配列の次元を掛け合わせたサイズであるため、ここではあまり改善できません。個人的には再帰を使用することをお勧めします。結果として得られる配列の数を非常に大きくしない限り、配列の数を大きくしすぎることはできないからです。
それぞれ n 1、 n 2 ... n k要素の k 配列があるとします。
すべての組み合わせを記述することは、すべての数値を混合基数で記述することに非常に似ています。
したがって、0 から (n 1 n 2 ...n k -1) までのすべての可能な数値を単純にループし、配列から取得した「数字」を使用して混合基数表現で書き留めます。必要なネストされたループは 2 つだけです。
もう 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: 常に各配列の最初の要素のみを保存します。