【问题标题】:O(n) and time complexity function of the given code给定代码的 O(n) 和时间复杂度函数
【发布时间】:2021-12-07 17:13:37
【问题描述】:

如果下面的循环结构在上界分析下,它仍然计算到 O(n^2) 吗? 我很困惑,因为内部循环依赖于外部循环,并且每次外部迭代时,内部 for 循环都会少循环一次。 除了 O(n) 之外,时间复杂度函数是否会是“n!.n+C”,其中 C 是常数?我假设n!因为内循环。

for(int i=n;i>0;i--)
{
 for(int j=i;j>=1;j--)
  {
     count++;
  }
}

【问题讨论】:

  • 对多个n 运行此代码,例如n = 1,2,...,15 并打印count,您会看到答案。或者将内部循环简化为count += i,您将更接近答案。然后,您可能还希望将外部循环简化为 1 + 2 + ... + n 之类的东西,这是一个算术序列,已知总和为 n*(n+1)/2,这是两个循环被简化到最后的最终公式。跨度>
  • 我很困惑,因为内部循环依赖于外部循环,并且每次外部迭代内部 for 循环循环的时间都会减少一次。 -- 时间会减少一次就复杂性而言绝对不值钱——这仍然是n^2。假装n 是一百万,而不是像 10 或 20 这样的小东西来概念化它。将每次迭代的次数减少一半(例如二进制搜索),那么您就完全不同了。

标签: c++ time-complexity big-o analysis


【解决方案1】:

让我们假设,外循环转到 n,内循环转到内循环的值。 (你的循环的反转情况)。 您可以使用公式计算的完整计数内循环

总和 k=1..n (k) = n * (n+1) / 2 = 1/2 * n^2 + 1/2 n

所以你的时间复杂度是

O(1/2 * n^2 + 1/2 n) = O(n² + n) = O(n²)

【讨论】:

  • 外循环到 n 内循环到内循环的值是什么意思。我无法完全理解你的意思。
【解决方案2】:

此代码与问题中的代码具有相同的时间复杂度。

for(int i = 0; i < n; i++){  // outer loop
    for(int j = 0; j < i; j++){  // inner loop
        count++;
    }
}

在外循环的第一次迭代(i = 0)中,内循环不执行。

在外循环的第二次迭代(i = 1)中,内循环执行once

在外循环的第三次迭代(i = 2)中,内循环执行twice

所以,在外循环的最后一次迭代中(i = n),内循环执行n times

因此,这段代码执行的总次数为

1 + 2 + 3 + … + n

= n(n + 1) / 2

= ((n^2) + n) / 2

= O(n^2)

【讨论】:

  • 解释得很好!
猜你喜欢
  • 2015-01-06
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 2019-12-09
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多