Rubyで、Cのような言語、または擬似コードを使用して、長さがそれぞれ異なる整数の可変数の配列の直積を作成し、結果を特定の順序でステップ実行する方法の例を探しています。 :
したがって、[1,2,3]、[1,2,3]、[1,2,3]:
[1, 1, 1]
[2, 1, 1]
[1, 2, 1]
[1, 1, 2]
[2, 2, 1]
[1, 2, 2]
[2, 1, 2]
[2, 2, 2]
[3, 1, 1]
[1, 3, 1]
etc.
私が見た典型的な結果の代わりに(以下に示す例を含む):
[1, 1, 1]
[2, 1, 1]
[3, 1, 1]
[1, 2, 1]
[2, 2, 1]
[3, 2, 1]
[1, 3, 1]
[2, 3, 1]
etc.
この例の問題は、最初の2つの組み合わせがすべて試行されるまで、3番目の位置がまったく探索されないことです。これを使用するコードでは、正しい答えは一般に(はるかに大きい)1,1,2ですが、それを見つける前に、数千ではなく数百万の可能性を調べます。
私は100万から数億の結果セットを扱っているので、それらを生成してから並べ替えることはここでは実行できず、最初の例でそれらを注文する理由を無効にします。以前のデカルト積生成から。
上記のいずれかを明確にするのに役立つ場合に備えて、これを今すぐ行う方法を示します(これは正しい結果と正しいパフォーマンスを示しますが、希望する順序ではありません。つまり、上記の2番目のリストのように結果を作成します)。
def cartesian(a_of_a)
a_of_a_len = a_of_a.size
result = Array.new(a_of_a_len)
j, k, a2, a2_len = nil, nil, nil, nil
i = 0
while 1 do
j, k = i, 0
while k < a_of_a_len
a2 = a_of_a[k]
a2_len = a2.size
result[k] = a2[j % a2_len]
j /= a2_len
k += 1
end
return if j > 0
yield result
i += 1
end
end
更新:私は、3が追加される前に、1、2のすべての組み合わせが調べられ、次に3と1がすべて、次に3と2と1がすべて、次に3がすべてが調べられる解決策を求めていることを明確にしませんでした、2。言い換えれば、「垂直」の前に「水平に」以前のすべての組み合わせを探索します。これらの可能性が探求される正確な順序、つまり1,1,2または2,1,1は重要ではなく、3に混合する前に2と1すべてが探求されるということです。