【发布时间】:2009-08-19 21:44:18
【问题描述】:
如果这已在其他地方得到回答,我深表歉意,但我尚未使用我有限的算法术语找到它。 ;)
我的情况是这样的 - 我有可变数量的数据元素,每个数据元素都经过测试,以确定兼容性。兼容性存储在等效于二维数组(真值表?)中。我的目标是生成这些数据元素的所有可能组合,其中组合中的每个元素都与其他元素兼容。
例如,如果元素 1(共 4 个)与元素 2 和 4 兼容,元素 2 与 1、3 和 4 兼容,元素 3 与 2 兼容,元素 4 与 1 和 2 兼容,我的真值表看起来像:
1) {1,1,0,1}
2) {1,1,1,1}
3) {0,1,1,0}
4) {1,1,0,1}
我想要的组合是:
1,2,4
1,2
1,4
1
2,3
2,4
2
3
4
我的方法在许多情况下都适用,但有时在元素数量超过 5000 个时会严重陷入困境,具体取决于数据集。我的次要挑战是确定将执行时间从 5 秒增加到 3 小时的模式...
仅查看布尔数组,我就觉得肯定有一个更简单的解决方案——也许是一个以某人命名的算法。正如您可能从上面推断的那样,我不一定知道如何提出这个问题。 ;)
感谢您的宝贵时间!
【问题讨论】:
-
为什么是 1,2,4 和 2,4 而不是 1,2 或 1,4?为什么是 3 和 4 而不是 1 或 2?
-
"...元素 3 与 1 兼容":我在您的图表中没有看到这一点。而如果3与1兼容,为什么1与3不兼容?
-
对不起,我把真值表的前言完全搞砸了——在坚持使用 base-1 和思考 base-0 时感到困惑。我的坏东西。我应该分别包含 1,2 和 1,4,以及 1 和 2。不是给人留下第一印象的好方法...
-
迈克,你可以编辑你的答案来纠正这些错误。
-
假设您有大约 30 个相互兼容的条目。然后它们的每个子集都必须出现在输出中;所以仅仅打印你的输出需要时间~2 ^ 30,或大约10 ^ 9。鉴于此,算法会在 5000 或更多条目上陷入困境也就不足为奇了。因为宇宙中的原子数量远低于 2^300——甚至不要想 2^5000。
标签: algorithm truthtable