Set Cover的暴力复杂性

时间:2014-10-16 09:24:36

标签: algorithm set-cover

我们可以通过形成所有可能的集合组合并验证它是否是最小解决方案来解决集合覆盖问题。现在我们最多可以有2 ^ n个这样的集合组合,其中'n'是Set的数量。

因此,这种方法的复杂性应该是O(2 ^ n)。但是,Wikipedia说'集合覆盖问题的复杂性是m ^ n,其中m是宇宙的大小,n是集合中集的数量'。

有人可以解释复杂性是O(m ^ n)而不是O(2 ^ n)?

先谢谢。

2 个答案:

答案 0 :(得分:1)

你几乎是对的;蛮力算法的复杂性是O(m 2 ^ n),直到模型依赖的对数因子,因为操纵这些集合是不自由的。 O(m ^ n)可能来自这样的想法:对于每个m个元素,我们选择最多n个集合中的一个来覆盖它。我能提供的最慈善的可能解释是,主要来源为集合覆盖的实例规定了O(m ^ k)的界限,其中每个元素属于最多k个集合,这是在近似算法的上下文中考虑的特殊情况(那里有多项式时间k-近似)。

答案 1 :(得分:0)

对我而言似乎相当简单。

问题可视化:

  • 将宇宙想象为一组路径(节点集)。
  • 想象一下收集作为宇宙中路径的子集。
  • 对于Universe中的每个节点,至少存在一条它所属的路径。
  

def Set Cover =包含所有节点所需的最小路径。

蛮力解决方案:

a = find number of unique nodes in universe
b = find all path permutations as list
c = find b elements where number of unique nodes equals a  
d = order c by path count and pick first

找到所有排列不是O(m ^ n),而是O(n!),如果宇宙大的话,这将是非常低效的。但是,您不需要所有路径排列,您可以找到最大为x的路径排列,其中x枚举从1到a。但是我假设你明白了。