假设我们有一个有限集合S和S的子集列表。那么,集合包装问题要求在列表中是否存在k个成对不相交的子集。该问题的最优化版本——最大集合包装问题,要求在列表中找到最大数量的成对不相交的子集。
链接:http://en.wikipedia.org/wiki/Set_packing 因此,令
链接: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)。
我没有找到有关所涉及算法的任何文章。您能否阐明一下呢?
我的方法:
按大小对集合进行排序。从最小的集合开始。如果下一个集合的任何元素都与当前集合不相交,则我们将它们合并并增加最大集合的计数。这听起来不错吗?还有更好的想法吗?
O(2^n * n^2)
算法。还有一个稍微复杂一些的O(2^n)
算法。独立集算法可以达到O(1.3^n)
或者更好的效果。 - Niklas B.