我对如何在此声明中确定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循环运行时间更长(但不是很多)所以这可能是对数吗?提前谢谢。
答案 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
次为某个整数t
和i==1
第二个while周期运行:n-t*2=0
次,用于某个整数t
和i==1
所以我们得到第一个n=t
到第二个n=2t
,所以n/2=t
第三个n/3=t