2015-11-12 19 views
5

私は時間の複雑さを計算するためにこの質問を行っていました。fun()の時間の複雑さ?

int fun(int n) 
{ 
    int count = 0; 
    for (int i = n; i > 0; i /= 2) 
    for (int j = 0; j < i; j++) 
     count += 1; 
    return count; 
} 

私の第一印象はOた(N Nをログ)が、答えはO(N)です。なぜそれがO(n)であるのか理解してください。

答えて

6

内側ループは、内側ループの反復の総数であるので等次いでn反復、n/2、次いでn/4を行います。したがって

n + n/2 + n/4 + n/8 + ... + 1 
<= n * (1 + 1/2 + 1/4 + 1/8 + ...) 
= 2n 

Geometric seriesを参照)、およびO(N)です。

+0

きちんと説明しました:) –

+0

外側ループはどうですか? – Luniam

+0

@Luniam外部ループは、O(n)反復(実際にはO(logn)を実行する)未満であるため、big-Oの複雑さには影響しません。 – interjay