我基本上相信这个问题有解决方案,但我无法弄清楚如何实现。
假设我有三个集合:
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(也可能是其他几种语言)移植解决方案。