f(n):
if (n<=2) then return 1;
else {
if (n>950) then { i=n/2; return f(i);}
else return f(n-2);
}
我想到了两个解决方案。
a)
O(1) when n<=2
T(n/2) + 1 when n > 950
T(n-2) + 1 when 950>=n>2
并解决复发问题:
O(1) when n<=2
Θ(log n) when n > 950
O(n^2) when 950>=n>2
b)但是我不太确定最后两个语句的复杂性,因为如果n大于950,则算法将调用f(i)直到i小于950,然后继续调用f(n- 2)。 所以,另一个解决方案就是这个:
O(1) when n<=2
T(n/2) + T(n-2) + 1 otherwise
并解决复发问题:
O(1) when n<=2
O(n^2) otherwise
我实际上认为第二个是正确的,但我不确定。 谢谢你的帮助。
答案 0 :(得分:2)
一旦n降到950,那么它每次都会减少2,所以从950到2是O(n) - 因为你基本上达到了一半的值,而1/2则消失在常数中。 / p>
但是观察到存在n的值,其中lg n>二分之九百五十○。因此,对于n的某个值,lg n项将占主导地位。 O(lg n)。
答案 1 :(得分:2)
O(1),n <= 2。
O(1)for 2&lt; 1。 n&lt; = 950 - 它需要恒定的时间(950/2)。
T(n / 2),n> 950。
所以你得到:T(n)= T(n / 2)+ 0(1)。
总复杂度= O(log n)。
答案 2 :(得分:0)
渐近行为是对复杂性增长的描述,它不是可以将 n 的各个值插入的函数。因此,对于 n 的不同值,有两个或三个不同的语句是没有意义的。
将其视为 n - &gt;无穷大, n 的行为&lt; 950变得可以忽略不计。