是否有通用的方法/方法/方法来计算此类循环的渐近时间复杂度?
j=a
while j<n do
j=f(j)
其中f(j)
可以是j+1
,2*j
,j*j
等。
请注意,上面的代码等同于C for-loop
for (j=a; j<n; j=f(j));
答案 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))).