【问题标题】:Which complexity is better?哪种复杂度更好?
【发布时间】:2014-05-15 16:01:24
【问题描述】:

假设一个图有N节点和M边,总迭代次数为k。 (k是一个常数整数,大于1,独立于NM

D=M/N 为图的平均度数。

我有两种基于图的迭代搜索算法。
第一种算法的复杂度为O(D^{2k})时间。
第二种算法的复杂度为O(k*D*N)时间。

根据他们的 Big O 时间复杂度,哪个更好?

有人告诉我第一个更好,因为图中的节点数量N 通常比现实世界中的D 大得多。

其他人说第二个更好,因为k 第一个呈指数增长,而第二个呈线性增长。

【问题讨论】:

  • 你对k还有什么要说的吗?它是否取决于NM 或其他任何东西?是常数吗?是否大于 1?
  • k是算法的参数还是输入的一部分?
  • 在两种算法之间动态决定的算法不会比其中任何一种都差。
  • 迭代次数k作为算法的输入参数给出。
  • 什么是小d?和大D一样吗?

标签: algorithm graph big-o complexity-theory


【解决方案1】:

总结

您的两个O 都不占优势,因此正确的方法是根据输入选择算法

O 统治

  1. D<1(稀疏图)等第一个更好。

  2. D比较大的时候第二个比较好

算法选择

重要的参数不仅仅是O,而是它前面的实际常量。 例如,O(n) 算法实际上是100000*n,比O(n^2) 更糟糕,n^2n<100000 时只是n^2

因此,给定图表和所需的迭代次数k,您需要估计每种算法的预期性能并选择最佳的。

【讨论】:

    【解决方案2】:

    Big-O 表示法描述了函数在其参数增长时如何增长。所以如果你想估计算法时间消耗的增长,你应该首先估计 D 和 N 将如何增长。这需要您的域中的一些额外信息。

    如果我们假设N 无论如何都会增长。对于D,您有多种选择:

    1. D 保持不变 - 第一个算法肯定更好
    2. DN 成比例增长 - 第二种算法更好

    更一般地说:如果D 的增长速度快于N^(1/(2k-1)),您应该选择第一种算法,否则 - 第二种算法。

    【讨论】:

      【解决方案3】:

      对于每个固定的 D,D^(2k) 是一个常数,因此如果 M 足够大,第一个算法将击败第二个算法。但是,什么足够大取决于 D。如果 D 不是恒定的或有限的,则无法比较这两种复杂性。

      在实践中,您将实现这两​​种算法,找到它们实际速度的良好近似值,然后根据您的值选择更快的算法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-09
        • 1970-01-01
        • 2015-01-30
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多