2

你能告诉我这个代码的渐近复杂吗?这个伪代码的渐近复杂度是什么?

f(n): 
if (n<=2) then return 1; 
else { 
    if (n>950) then { i=n/2; return f(i);} 
    else return f(n-2); 
} 

我想到了两种解决方案。

一)

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 

二)但是我不那么肯定对最后两个语句的复杂性,因为如果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 

其实我觉得第二个是对的,但我不知道这一点。 感谢您的帮助。

回答

2

好的,所以首先想想如果n是真的会发生什么大。最终,n将会大到足以控制其他的一切。当然,直到你达到n = 950,你会得到O(lg n),其中“lg”表示对数基数为2.(为什么我知道这个问题呢?因为n的大小减少了一个功率每次迭代两次)

一旦n下降到950,那么它会每次减少2,所以从950到2是O(n) - 因为你基本上打了一半的值,而1/2消失在常数中。

但是请注意,存在一个n值,其中lg n> 950/2。对于n的某个值而言,这个术语将占主导地位。 O(lg n)。

0

渐近行为是对复杂性增长的描述,它不是一个函数,可以将个别值n插入。因此,对于不同的值n有两个或三个不同的陈述是没有意义的。

考虑,作为ñ - >无穷大,为Ñ < 950的行为变得可忽略不计。

2

O(1)for n < = 2。

O(1)for 2 < n < = 950 - 需要一定的时间(950/2)。

对于n> 950,T(n/2)。 (n)= T(n/2)+ 0(1)。

总复杂度= O(log n)。