【发布时间】:2014-03-08 17:14:32
【问题描述】:
假设我们有一个有限集 S 和一个 S 的子集列表。然后,集合打包问题询问列表中的一些 k 子集是否成对不相交。 该问题的优化版本,最大集打包,要求列表中成对不相交集的最大数量。
http://en.wikipedia.org/wiki/Set_packing
那么,让S = {1,2,3,4,5,6,7,8,9,10}
and `Sa = {1,2,3,4}`
and `Sb = {4,5,6}`
and `Sc = {5,6,7,8}`
and `Sd = {9,10}`
那么成对不相交集的最大数量为3(Sa, Sc, Sd)
我找不到任何有关所涉及算法的文章。你能解释一下吗?
我的做法:
根据大小对集合进行排序。从最小尺寸的集合开始。如果下一个集合中没有元素与当前集合相交,那么我们将集合合并并增加最大集合的计数。这听起来不错吗?有更好的想法吗?
【问题讨论】:
-
它不会让您获得最佳效果,但可以提供一个很好的近似值
-
你的集合都是连续的数字范围吗?
-
@ Niklas - 是的,这些数字是连续的 {1 到 30000+}
-
对不起。我误解了你的问题。子集按升序排序,但数字可能不连续。原始集合是一个连续数字的列表
-
@user3080029:有一个简单的
O(2^n * n^2)算法。还有一个稍微复杂的O(2^n)算法。独立集算法可以和O(1.3^n)什么的一样好。
标签: algorithm set disjoint-sets