algorithm - 查找所有集不包含任何子集

标签 algorithm list set

我有一个问题,我正在研究最快的算法来找到一个集合,该集合是原始集合 (S) 的子集并且不包含 S 的任何子集 (S1, ... Sn)。我想要的集合to find 可以包含 Si 的一些元素,但不包含全部。

例如原始集合:S = (1, 2, 3, 4, 5), S1 = (1, 2), S2 = (1, 3) => 最长的集合: (2, 3, 4, 5); 其他集合:(1, 4, 5), (2, 4, 5), (3, 4, 5), (1, 4),...

有人可以给我建议吗?谢谢!

最佳答案

坏消息

考虑选择不包含哪些元素的问题。

如果我们选择不包含元素 1,则满足 S1 和 S2 的约束。

如果我们选择不包含元素 2,则满足 S1 的约束。

如果我们选择不包含元素 3,则满足 S1 和 S3 的约束。

所以 1 给出 {S1,S2},2 给出 {S1},3 给出 {S3}。

您的问题可以表示为找到最少数量的不包含元素,使得满足集合(例如 {S1,S2})的并集覆盖所有给定集合。

这正是 set cover problem这是 NP 完全的。

好消息

在实践中,您可能会做得很好,只需根据最终覆盖最多集合的元素选择不包含的元素即可。

这是一个易于实现的贪心算法(尽管它不会总是给出最优答案)。

关于algorithm - 查找所有集不包含任何子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34047586/

相关文章:

c++ - 一种通过 ID 访问并查找加权随机项的高效数据结构

algorithm - 确定有向图或无向图是否为树

python - 从字符串列表中删除重复项

mysql - MySQL GROUP BY 语句中 List 聚合函数的替代方法

MySQL 局部变量

algorithm - 舰队作战策略游戏AI

java - 从 Java 中的数组构建树结构(用于目录)

c - 使用列表内存 - 家庭作业

php - 将整个 mysql 结果集转储到数组中的最有效方法?

c++ - 我该如何改进这种强制我声明成员函数 const 并声明变量可变的设计?