两个嵌套for循环的时间复杂度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个嵌套for循环的时间复杂度相关的知识,希望对你有一定的参考价值。

如果我在正确的轨道上,这个问题是从过去的试卷中修改,只需要建议。

根据给定T(n)的操作次数计算出以下代码段的时间复杂度integer n

for ( int k = n; k >0; k /= 3 ) {
  for ( int i = 0; i < n; i += 2 ) {
     // constant number C of elementary operations
  }
  for ( int j = 2; j < n; j = (j*j)) {
      // constant number C of elementary operations
  }
}

所以我认为外环将是O(logn),第一个内环将是O(n),第二个内环将是O(logn)。只是想知道我是否有一个粗略的想法以及如何从这里前进。

答案

最近有一个问题在几天前有些类似,我提供了复杂性分析的逐步描述:https://stackoverflow.com/a/49093954/926701

  • 外环确实是O(log3(n))
  • 第一个内环确实是O(n)
  • 第二个内环是O(log2(log2(n)))

非正式地,对于第二个循环,j(k)j循环的索引for所取的值序列,我们可以写:

j(1) = 2, j(2) = j(1)^2 = 4, j(3) = j(2)^2 = 16, ..., j(k) = j(k-1)^2 >= n 
=> j(k) = j(k-1)^2 = j(k-2)^4 = ... = j(1)^(2^k) = 2^(2^k)
=> k = log2(log2(n))

由于内部循环中的操作数独立于外部循环中的操作数,因此我们可以增加复杂性:

T(n) = O(log3(n) * (n + log2(log2(n))))
     = O(n.log3(n))

因为log2(log2(n)) << nn -> +Inf

以上是关于两个嵌套for循环的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

三个嵌套 for 循环的时间复杂度

Python中嵌套For循环的时间复杂度

具有多个 if 语句的嵌套 for 循环的时间复杂度

一般三个嵌套循环的 O(n^3) 复杂度的数学推导

如何使用嵌套的 for 循环将两个 2d(倾斜)数组相加?

使用两个嵌套的 for 循环和 str() 函数将列表中的偶数相加