最小集合覆盖算法:寻找最佳覆盖的大小

时间:2015-04-19 05:30:42

标签: algorithm optimization np set-theory set-cover

集合覆盖问题包括以下内容:

  

鉴于:

     
    
        
  1. 一组项目U.

  2.     
  3. 一组集合S,每个集合S包含来自U的项目。

  4.        
     

找到集合C的集合:

     
    
        
  1. C是S的子集。
  2.     
  3. C中的集合包含U.中的所有项目(至少一次)。
  4.        
     

可选地,可以找到最小 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吗?如果没有,怎么能找到这个呢?

1 个答案:

答案 0 :(得分:2)

如果您能在P时间内找到最小封面的大小,那么您也可以在P时间内找到最小封面。

对于S中的每个X,找到U - X的最小封面的大小。如果它比U的最小封面的大小小,那么你知道有一个包含X的最小封面(注意:最小封面为U - X从不包括集合X)。重复,直到找到最小的封面。

请注意,封面的大小最多为| U |,每次迭代都需要| S |要考虑X,所以如果你有P时间方法找到最小覆盖的大小,整个过程就是P-time。