私はこの問題に対する答えがあるとほとんど確信していますが、私の一生の間、それを行う方法を理解することはできません。
私が3つのセットを持っているとしましょう:
A = [ 'foo', 'bar', 'baz', 'bah' ]
B = [ 'wibble', 'wobble', 'weeble' ]
C = [ 'nip', 'nop' ]
そして、デカルト/クロス積を計算する方法を知っているので(このサイトや他の場所で、あちこちでカバーされています)、ここではそれについては説明しません。
私が探しているのは、セット全体を生成したり、n番目のアイテムに到達するまで反復したりせずに、デカルト積から特定のアイテムを簡単に選択できるアルゴリズムです。
もちろん、このような小さなサンプルセットを簡単に繰り返すことはできますが、私が取り組んでいるコードは、はるかに大きなセットで機能します。
したがって、私は関数を探しています。それを「CP」と呼びましょう。ここで、
CP(1) == [ 'foo', 'wibble', 'nip' ]
CP(2) == [ 'foo', 'wibble', 'nop' ]
CP(3) == [ 'foo', 'wobble', 'nip' ]
CP(4) == [ 'foo', 'wobble', 'nop' ]
CP(5) == [ 'foo', 'weeble', 'nip' ]
CP(6) == [ 'foo', 'weeble', 'nop' ]
CP(7) == [ 'bar', 'wibble', 'nip' ]
...
CP(22) == [ 'bah', 'weeble', 'nop' ]
CP(23) == [ 'bah', 'wobble', 'nip' ]
CP(24) == [ 'bah', 'wobble', 'nop' ]
そして、答えは多かれ少なかれO(1)時間で生成されます。
私は、必要なA、B、Cから要素のインデックスを計算し、元の配列からそれらを返すことが可能であるはずだという考えに従ってきましたが、私の試みはこれを正しく機能させるには、これまでのところ、機能していません。
私はPerlでコーディングしていますが、Python、JavaScript、またはJava(およびおそらく他のいくつか)からソリューションを簡単に移植できます。