【问题标题】:Brute force complexity of Set CoverSet Cover 的蛮力复杂性
【发布时间】:2014-12-11 14:31:39
【问题描述】:

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

所以,这种方法的复杂度应该是 O(2^n)。然而,Wikipedia 说“集合覆盖问题的复杂性是 m^n,其中 m 是宇宙的大小,n 是集合中集合的数量”。

谁能解释复杂度是 O(m^n) 而不是 O(2^n)?

提前致谢。

【问题讨论】:

  • 如果给定 n 个集合。我们最多可以有 2^n 个集合组合。对吗?
  • 嗯,你是对的,我快速浏览一下 Wiki 的编辑历史,这些行是最近添加的,可能是错误的!

标签: algorithm set-cover


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    对我来说似乎很简单。

    问题可视化:

    • 将宇宙想象为一组路径(一组节点)。
    • 将集合想象成宇宙中路径的子集。
    • 对于 Universe 中的每个节点,至少存在 1 条路径。

    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。不过我想你明白了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多