是否有一般方法计算for循环的渐近时间复杂度?

时间:2016-06-05 18:50:11

标签: algorithm loops time-complexity

是否有通用的方法/方法/方法来计算此类循环的渐近时间复杂度?

j=a
while j<n do
    j=f(j)

其中f(j)可以是j+12*jj*j等。

请注意,上面的代码等同于C for-loop

for (j=a; j<n; j=f(j));

2 个答案:

答案 0 :(得分:2)

首先是答案,然后是一般方法:

1)如果f(j)= j + 1,那么你将有大约n步到达n。

2)如果是2 * j。每次你以大约log n步骤加倍,你将达到n。

3)如果j * j,它将a,a ^ 2,a ^ 4,a ^ 8;因此,在大致loglog n步骤中,您将进入n。

现在,一般方法是什么?你找到模式并将其等于n,然后求解方程式:

1)应用f x次将得到+ x,所以a + x = n所以x = n - a = O(n)。

2)应用f x次将得到*(2 ^ x),因此a *(2 ^ x)= n,因此x = log n / a = O(log n)。

3)应用fx次会得到^(2 ^ x),所以a ^(2 ^ x)= n所以2 ^ x = log_a n,所以x = log log_a n = O(log log n) 。 (log_a n是基数a的n的对数)

我希望它有所帮助

答案 1 :(得分:2)

方法是解决复发问题

F(j+1) = f(F(j)), F(0) = a.

然后解决不公平

F(k(n)) < n <= F(k(n)+1), 

代表k(n),复杂度为O(k(n))

例如,f(j):= j²产生

F(j+1) = F²(j), F(0)= a

有解决方案

F(j) = a^(2^j).

然后通过反转

k(n) ~ log(log(n)/log(a))/log(2) = O(log(log(n))).