【问题标题】:Calculating Time Complexity for nested loops计算嵌套循环的时间复杂度
【发布时间】:2016-09-23 09:25:07
【问题描述】:

在我坚持了几天的关于 Big O 时间复杂度分析的测试中遇到了这个问题:

下面是C代码:

   if ( A > B ) {
       for ( i=0; i<n^2/100; i++ ){     //1
           for ( j=n^2; j>i; j-- ){     //2
               A += B;}}
   }
   else {
       for ( i=0; i<2n; i++ ){         //3   
           for ( j=3n; j>i; j-- ){     //4
               A += B;}}
   }

我的第一直觉是这个算法会有一个 O(n2) 的大 O 和嵌套的 for 循环等,但它不是一个多项选择回答。尝试手动计算每个循环迭代,但无法计算每个内部循环(2 和 4)中 i 的变化。尝试将其写为总和时也遇到了麻烦。

【问题讨论】:

  • 第一个不是嵌套在n上,而是在n squared上。

标签: c time-complexity big-o nested-loops


【解决方案1】:

考虑A &gt; B 的第一种情况。对于外部循环迭代的每个i 值,内部循环执行等于n^2 - i 的迭代次数。考虑n = 2i = 1n^2 = 4 和内部循环迭代 j = 4, j = 3, j = 2,三个迭代,与我们的发现一致。

因此,内部循环的总迭代次数是所有n^2 - i 的总和,其中i0 变化到floor(n^2/100) - 1。让我们定义k := floor(n^2/100) - 1。那么这个总和等于kn^2 - k(k+1)/2。替换k 所代表的表达式,我们恢复[floor(n^2/100) - 1]n^2 - [floor(n^2/100) - 1][floor(n^2/100)]/2。这不大于(n^2/100 - 1)n^2 - (n^2/100 - 1)(n^2/100)/2。我们可以乘以得到n^4/100 - n^2 - n^4/20000 + n^2/200 = n^4(1/100 - 1/20000) - n^2(1 - 1/200)。由此我们可以看出,第一种情况的时间复杂度为O(n^4)。确实,也是Omega(n^4)Theta(n^4)

A &lt;= B的情况下,分析类似。很容易证明,第二种情况的时间复杂度是O(n^2)Omega(n^2),因此是Theta(n^2)

因此,我们可以自信地说:

  • 最坏情况时间复杂度为O(n^4)
  • 最佳情况时间复杂度为Omega(n^2)
  • 实际上每个边界都可以指定为Theta 边界。

【讨论】:

  • 将案例分开给出大 O 是不对的。例如快速排序是 O(n^2) 而不是 O(n),这是中等时间复杂度。 Big O 必须涵盖所有情况!
  • @coder quicksort is O(n^2) 更正确的说法是快速排序的最坏情况时间复杂度是O(n^2)。快速排序本身是一种算法,而不是受任何数字序列限制的函数。
  • 上述算法程序不能有大O,取决于情况,你必须选择一个表示上述算法最坏情况的函数。它被问到上述算法程序的时间复杂度,而不是在特殊情况下......它没有被要求找到一个上限函数(一个由任何数字序列界定的函数),在某些情况下,很明显大 O算法的(就像快速排序的大 O 和其他所有算法)
  • @coder 最坏的情况是A &gt; B。在这种情况下,时间复杂度为O(n^4)。最好的情况是A &lt;= B。在这种情况下,时间复杂度为Omega(n^2)。我看不出这个分析有什么问题。如果您只对最坏情况的上限感兴趣,就像在算法分析中经常出现的情况一样,您可能会说“算法是 O(n^4)”。但这是真正意图的非正式缩写。
猜你喜欢
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多