【问题标题】:Algorithmic Approach to generating all combinations based on a large Truth-Table基于大型真值表生成所有组合的算法方法
【发布时间】: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


【解决方案1】:

我认为您拥有的是“邻接矩阵”而不是真值表,并且您正在寻找以邻接矩阵作为表示的图形的所有“完全连接的子图”。如果没有记错的话,完全连接的子图也被称为“集团”。我不太确定您在寻找什么;正如一位较早的受访者指出的那样,您的文字和矩阵之间存在一些差异。

根据这些条款进行一些谷歌搜索;现在就在这里,无论是从我的脑海中还是从我的图书馆中挖掘这些东西都为时已晚。

请注意,您的图形是对称的,即如果“1 与 2”兼容,则“2 与 1”必然兼容。现在,您的数据存储需求减少了一半(使它们更加复杂,存储矩阵的上半部分或下半部分通常比它节省的空间更令人费解)。我还认为您可能应该在主对角线上使用 1,以表达“1 与 1 兼容”的想法。最终,我怀疑,你会有一些只与它们自己兼容的元素。

遗憾的是,在图形中查找派系是 NP,但对于只有 5000x5000 个元素的矩阵,在编译语言中,蛮力天真的算法不应该花费太长时间。

问候

标记

【讨论】:

  • 邻接矩阵 - 我需要记住的一个术语。 ;) 谢谢你也提供了一些其他的术语——我的背景不包括算法训练的方式,但我不记得像这个项目一样享受任何其他项目——要学习的东西太多了! :) 对于数据存储——我实际上使用的 NxN 不到一半——我的方法确保我只比较较低的索引和较高的索引。 (虽然现在我想知道用于确定实际索引的数学是否增加了我的性能问题......)我正在用 Java 编码 - 以后可能会与 C++ 进行比较。 :) 谢谢马克! :)
  • 简洁的解释 - 知道所有 NP 完全问题都是同构的是一回事,但看到它被很好地证明是另一回事!
【解决方案2】:

您基本上是在尝试将表达式简化为析取范式。一般来说,这个问题是NP完全的。对不起。 ^_^

【讨论】:

  • 如果事实证明是这样,那么这一切都归结为我的实现。我只是想确保我没有错过可能是显而易见的解决方案。 :) 谢谢汤姆!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
相关资源
最近更新 更多