【发布时间】:2012-04-14 06:04:34
【问题描述】:
我基本上相信这个问题有一个答案,但我这辈子都不知道该怎么做。
假设我有三套:
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(可能还有其他一些)移植解决方案
【问题讨论】:
-
由于我在 CPAN 上没有找到进行这种“惰性”计算的任何内容,因此我上传了以下模块,因此其他人不必自己编写代码:metacpan.org/release/Set-CartesianProduct-Lazy跨度>
标签: algorithm perl math cartesian-product cross-product