嵌套for循环中嵌套while循环的时间复杂度

时间:2018-02-22 20:24:13

标签: time-complexity

我在分析此算法的时间复杂度时遇到一些困难:

for i = 1 to n do
   for j = 1 to n do
      k = j
      while k <= n do
        k = k*3
      end while
   end for
end for

我知道外部for循环将运行n次,内部for循环将运行n^2次。但是,对于while循环,我已将费用缩小到n^2 + (some factor)*n,但我不知道从哪里开始。我很感激帮助。

1 个答案:

答案 0 :(得分:0)

我们可以立即将外部for循环分解出来,因为内部逻辑都不依赖于它的迭代变量i

现在让我们看看while循环。您已正确推断出它是对数 - 但它依赖于哪些变量?在m执行此循环后,k的值为:

enter image description here

当循环大于n时循环中断,因此它执行的次数max(m)为:

enter image description here

总复杂度,等于内部for循环和while循环的组合复杂度的n倍,因此是以下总和:

enter image description here

我们如何处理圆角括号?如果将数字四舍五入到最接近的整数,则结果总是与原始数字不同小于1 。因此,差异可以写为常量O(1)

enter image description here

位于:

  • (1),(2),(4)我们使用了三个对数规则,
  • (3)我们使用 factorial n! = n(n-1)(n-2)...1的定义,
  • (4)我们使用了Stirling's approximation
  

因此,总时间复杂度为:

     

enter image description here

     

正如我在评论中提到的,没有对数术语或因子

编辑数值测试以确认此结果。 JavaScript代码:

function T(n) {
   var m = 0;
   for (var i = 1; i <= n; i++) {
      for (var j = 1; j <= n; j++) {
         var k = j;
         while (k <= n) {
            k *= 3;
            m++;
         }
      }
   }
   return m;
}

测试结果:

n       T(n)
-----------------
1000    1498000
1500    3370500
2000    5992000
2500    9365000
3000    13494000
3500    18357500
4000    23984000
4500    30361500
5000    37475000
5500    45347500
6000    53976000
6500    63336000
7000    73472000
7500    84345000
8000    95952000
8500    108324000
9000    121482000
9500    135337000
10000   149960000

T(n)针对n^2

的情节

enter image description here

一条非常整洁的直线,证明T(n)与大型投入的n^2成正比。