【问题标题】:Analyzing algorithms for time complexity分析时间复杂度的算法
【发布时间】:2011-11-28 07:32:55
【问题描述】:

我正在分析一种算法,我只想知道我是否走在正确的轨道上。

对于这个算法,我只计算行中包含 *** 的乘法。

算法如下:

  1. 所以我从最里面的行开始,我可以看到那里有 2 个操作(两个乘法)。
  2. 现在我正在查看最里面的 2 个循环,所以我可以看出 p=p*20*z 被准确地执行了 (j) + (j-1)+(j-2)+(j-3)...1 次。这恰好等于j(j+1)/2
  3. 所以总的来说,因为有两个乘法,它发生在2 * (j(j+1)/2)
  4. 最后,“i”循环恰好发生了 n 次,所以总共是 n(2 * (n(n+1)/2))

这就是我背后的思考过程。我对么?谢谢。

【问题讨论】:

  • 不,你不是。最终结果应该只包含n。你有j 那里。
  • 感谢您的快速响应。会是 n(2 * (n(n+1)/2)) 吗?
  • 实际上,我认为这只是一个错字,因为将 j 替换为 n 对于他在那里经历的推导是正确的,因为 n 是最大的 j。 @PragmaOnce 是的,尽管显然可以简化很多。
  • 是的,这就是我在原始问题中的意思,但忘记用 n 替换 j。谢谢你们俩。有人想发布答案以便我将其标记为正确吗?

标签: algorithm computer-science big-o time-complexity


【解决方案1】:

你的思维过程是正确的。您需要用 n 替换 j 项(n 是 j 可以假设的最大值),但这可能是一个错字。

此外,您可以从您所在的位置进一步简化:

n(2*(n(n+1)/2))
2*n*(n^2+n)/2
n^3+n^2

=> O(n^3)

最后一步是因为 n 立方项将以比 n 平方项大得多的速度增长,我们可以说它将主导大 n 的运行时间。我要提到的唯一一点是,您也许应该将存储到 p 视为一个运算以及两个乘法,尽管显然这不会改变简化的 big-o 运行时。

【讨论】:

  • 谢谢,+1 简化!
【解决方案2】:

如果您发现所有三个循环都具有相同的退出条件up to n,则可以简化此特定示例中的计算:

  1. i <= n
  2. j <= n
  3. k <= j

基本上第三个循环也会运行n 迭代,因为j <= n 所以k <= n, 这意味着复杂度将是n * n * n = O(n ^ 3)

【讨论】:

    【解决方案3】:

    这是有条不紊地获得算法增长顺序的方法:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多