【问题标题】:O notation of a Loop [duplicate]循环的 O 表示法[重复]
【发布时间】:2017-11-24 13:15:38
【问题描述】:
for(int i = 0; i < n; i++) {
   for(int j = 0; j < i; j++) { 
      O(1);
   }
}

这里的函数是n * (n+1) / 2,但是如果外循环条件是i &lt; log(n)呢?我对相互关联的循环有疑问。

【问题讨论】:

  • 如果您将n 替换为其他内容,只需将n * (n+1) / 2 中的每个n 替换为相同的内容即可。这似乎归结为对基本代数缺乏了解(或暂时的精神失误)。

标签: algorithm performance notation


【解决方案1】:

你只需要计算迭代的总数:

1 + 2 + 3 + .. + n - 1 = n * (n - 1) / 2

正如您正确推断的那样。当您将 n 替换为 log(n) 时,只需在最终公式中执行相同操作,然后将其变为 log(n) * (log(n)+1) / 2,或者在 Big-O 表示法中,O((log(n))^2)

【讨论】:

  • 1 + 2 + 3 + .. + n = n * (n+1) / 2,而不是1 + 2 + 3 + .. + n - 1
  • @AnthonyLabarre 当然,非常愚蠢的错误。 Tnx。
【解决方案2】:

如果外部循环的条件更改为i &lt; log(n),那么嵌套双循环构造的整体复杂度从 O(n2) 变为 O(log(n)2)

您可以通过简单的替换 k = log(n) 来展示这一点,因为循环的复杂度就 k 而言是 O(k2)。反转替换产生 O(log(n)2)。

【讨论】:

    【解决方案3】:

    对于嵌套的 for 循环(使用 O 表示法时,ofc),您可以乘以所有这些循环的最坏情况。如果第一个循环到 x 并且你有一个嵌套循环到 i (i 在最坏的情况下 x) 那么你的运行时复杂度为 O(x^2)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 2017-01-02
      相关资源
      最近更新 更多