嵌套while循环的时间复杂度

时间:2016-10-18 07:05:12

标签: algorithm loops time-complexity big-o

我对如何在此声明中确定while循环的时间复杂性感到难过:

procedure P (integer n);
 for (i: 1 to n)
   x := n;
   while (x > 0)
         x := x - i;

我知道for循环运行(n-1)次。起初我认为while循环会运行n次,因为我误将i误认为是1但事实并非如此。我一直在输入数字以查看程序何时停止,但看不到一致的模式。我注意到随着n增加,while循环运行时间更长(但不是很多)所以这可能是对数吗?提前谢谢。

2 个答案:

答案 0 :(得分:4)

第一次运行使n个while循环
第二次运行使n / 2个周期为周期 第三次运行使n / 3个周期为周期 第k次运行使循环中的n / k

所以整体时间与

成正比
n * (1/1 + 1/2 + 1/3 +...+1/n)

在括号中我们可以看到harmonic series的部分和,它倾向于n的自然对数,复杂度是O(n log n)

答案 1 :(得分:0)

MBo的答案很详细。 如果到目前为止,您可能会问自己,为什么第一次运行有n个while循环,第二个运行n / 2个while循环,等等。

     x := n;
     while (x > 0)
         x := x - i;

在while循环的条件下,所有循环一直运行到x==0

因此第一次进行while循环运行:n-t*1=0次为某个整数ti==1

第二个while周期运行:n-t*2=0次,用于某个整数ti==1

所以我们得到第一个n=t到第二个n=2t,所以n/2=t第三个n/3=t