如果在其他地方已经回答了这个问题我很抱歉,但我还没有用我有限的算法术语找到它。 ;)
我的情况是这样的 - 我有一个可变数量的数据元素,每个数据元素都已针对彼此的数据元素进行测试以确定兼容性。兼容性存储在等效于二维数组(真值表?)中。我的目标是生成这些数据元素的所有可能组合,其中组合中的每个元素都与其他元素兼容。
例如,如果元素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小时的模式......
仅仅从查看布尔数组,我觉得那里必须有一个更简单的解决方案 - 一个以某人命名的算法,也许。正如您可能从上面推断的那样,我不一定知道如何提出这个问题。 ;)
谢谢你的时间!
答案 0 :(得分:4)
我认为你所拥有的是一个'邻接矩阵',而不是一个真值表,你正在寻找邻接矩阵表示的图的所有“完全连通的子图”。完全连接的子图也是已知的,如果记忆服务,则称为“派系”。我对你所寻找的东西并不十分肯定;正如之前的一位受访者所说,你的单词和矩阵之间存在一些差异。
在这些条款上做一些谷歌搜索;就在这里,我从我的头脑或图书馆挖出这些东西为时已晚。
请注意,您的图表是对称的,即如果'1与2兼容'则必然'2与1兼容'。现在,这使您的数据存储要求减半(使它们变得更加复杂,存储矩阵的上半部分或下半部分通常比保存权证的空间更令人费解)。我想也许你应该在主对角线上有1个,以表达“1与1兼容”的想法。最后,我怀疑,你会有一些只与自己兼容的元素。
遗憾的是,在图表中查找派系是NP,但对于只有5000x5000个元素的矩阵,蛮力天真的算法在编译语言中不应该花费太长时间。
此致
标记
答案 1 :(得分:1)
你基本上试图将表达式简化为析取范式。一般来说,这个问题是NP完全的。抱歉。 ^ _ ^