集合覆盖问题包括以下内容:
鉴于:
一组项目U.
- 醇>
一组集合S,每个集合S包含来自U的项目。
找到集合C的集合:
- C是S的子集。
- C中的集合包含U.中的所有项目(至少一次)。
醇>可选地,可以找到最小 C,即| C |尽可能小。
Wiki Link to Set Cover Problem
我知道SCP是NP-Complete,MSCP(或Optimal SCP)是NP-Hard,并且可以使用许多技术中的一种来找到它(贪心算法,遗传算法,人工神经网络)。
但是,我想问一下,找到C(即| C |)的大小是否也是NP-Hard。
举例:
Given the following S:
[2 4 6], [1 3 5], [3 2 1], [5 4 6], [2 3 5]
And U being:
1 2 3 4 5 6
A possible Set-Cover (C) is:
[2 4 6], [1 3 5], [2 3 5]
However, the Optimal Set-Cover (C) is:
[3 2 1], [5 4 6]
Thus |C|, the size of the Optimal Set-Cover is 2.
我想找到| C |没有解决问题。 这是NP-Hard吗?如果没有,怎么能找到这个呢?
答案 0 :(得分:2)
如果您能在P时间内找到最小封面的大小,那么您也可以在P时间内找到最小封面。
对于S中的每个X,找到U - X的最小封面的大小。如果它比U的最小封面的大小小,那么你知道有一个包含X的最小封面(注意:最小封面为U - X从不包括集合X)。重复,直到找到最小的封面。
请注意,封面的大小最多为| U |,每次迭代都需要| S |要考虑X,所以如果你有P时间方法找到最小覆盖的大小,整个过程就是P-time。