【问题标题】:Comparing algorithm complexity比较算法复杂度
【发布时间】:2010-08-10 21:45:42
【问题描述】:

请帮我比较一下两种算法的复杂度。

  1. O(N+1000) + O(M*log(M))
  2. O(N*5) + O(2000)

N = 100000 M = 100

看不懂,O(...)怎么办?我可以离开吗?然后就做...

(N+1000) + (M*log(M)) = 101200
(N*5) + 2000 = 502000

对吗?

谢谢

更新

我有任务,我有两个可能的解决方案。第一个解决方案的算法复杂度O(N) + O(M log(M)),见http://code.google.com/p/redis/wiki/ZunionstoreCommand;第二种解决方案由两种算法组成,复杂度为O(N)http://code.google.com/p/redis/wiki/SunionCommandO(N*M)http://code.google.com/p/redis/wiki/SinterCommand。我认为我可以用现实世界的值替换 N 和 M 来比较两种解决方案的速度。

【问题讨论】:

  • 关于 Big-O 表示法的维基百科文章应该有助于澄清问题:en.wikipedia.org/wiki/Big_O_notation
  • Big-O 对实际数字毫无意义。即,如果你知道 N 和 M 是什么,那么一切都是常数。
  • @Brian:这里 N 和 M 的目的是提供幅度。例如,O(k*n) 的基数排序比快速排序的 O(n^2) 慢,直到 n 足够大。如果您有 n 大小的实际数字,那么您可以确定应该使用哪个。
  • @indiv 是的,但此时您不再使用 O,您实际上是在查看常量... Big-O 的重点是不要查看数字...

标签: algorithm complexity-theory


【解决方案1】:

Big-O notation 不会告诉您特定算法对特定数据集的速度有多快 - 它会告诉您渐近性能。在 Big-O 表示法中,您可以忽略常数和常数系数:

  1. O(N + M*log(M))
  2. O(N)

现在您可以看到第二种算法具有更好的渐近性能。

【讨论】:

  • 谢谢。我有任务,我有两个可能的解决方案。第一个解决方案的算法复杂度O(N) + O(M log(M)),见code.google.com/p/redis/wiki/ZunionstoreCommand;第二个解决方案比较了两种算法的复杂性O(N)code.google.com/p/redis/wiki/SunionCommandO(N*M)code.google.com/p/redis/wiki/SinterCommand。我认为我可以用现实世界的值替换 N 和 M 来比较两种解决方案的速度。
  • @Kirzilla:为了比较真实世界的速度,最好的方法是通过运行代码和计时需要多长时间来衡量典型数据的实际性能。常量有时会产生很大的不同,除非运行它,否则很难预测它们是什么。
【解决方案2】:

在一般情况下比较复杂性时,您会忽略常量值。

O(N+1000 + M*log(M))

变成

O(N + M*log(M))

同时

O(N*5 + 2000)

变成

O(N)

现在,如果您确定这些是 M 和 N 的值,您可以进行数学运算并更精确,但您还必须知道每个操作需要多长时间 - 大 - O 表示法用于缩放,而不是算法在特定情况下的执行方式。如果您的数据是静态的,您不妨同时运行这两种算法,看看哪个返回更快。

编辑:正如其他人指出的那样,正确的符号不是两个大 O 的总和,而是总和的大 O。

【讨论】:

    【解决方案3】:

    正确地说,O(N+1000) + O(M*log(M)) 实际上没有任何意义,因为 O(f(n)) 是所有函数 g(n) 的集合,因此等等等等在大白书等等中查找它。安迪你不能加套功能。

    是的,这是一种常见的符号滥用,但是,由于学究气(并且已经教过该课程多次),我不得不指出正确的答案是“Mu”。

    【讨论】:

    • +1 表示滥用符号。我已经相应地修正了我的答案。
    • 不是作业吗?抱歉,它真的看起来像家庭作业...随时取消标记。
    【解决方案4】:

    我不太喜欢你被要求回答的问题。

    Mark Bryers 所说的是正确的 - 您可以使用 Big-O 表示法忽略常量。

    对此进行扩展:原因是 Big O 表示法应该是渐近增长的指示,用外行的话来说,这意味着描述算法复杂性的 Big-O 表示法表明它会变得多快或多慢对于非常大的输入大小。这是因为“渐近线”指的是“接近渐近线”(函数未定义的地方),在 Big-O 表示法的情况下,它指的是无限(例如非常大的输入大小)。

    现在,出于这个原因,我发现 Big-O 中存在加法或常数乘法是非常奇怪的——你应该摆脱那些使用 Big-O 表示法的...这就是重点。问题是这样问的吗?另外,算法不应该用 两个 Big-O 来描述(它应该只是一个,正如 Peter Leppert 所说和解释的那样)。

    我回答这个问题的方法是去掉常量,因为它们不应该在那里,然后在给定 n 和 m 的情况下评估它们,然后比较。

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 2011-04-02
      • 2021-07-20
      相关资源
      最近更新 更多