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)。