2017-11-06 1 views
4

与えられたプログラムに対して、時間の複雑さは何か。私の理解へ与えられた関数の時間複雑さを求める

int count = 0; 

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

iループを分割し、征服し、それゆえO(logn)あるとjループがO(n)あるので、それはO(nlogn)する必要があります。

ただし、正解はO(n)です。なぜ誰かが説明できますか?

+2

をそして、あなたの質問は... –

+0

最悪の場合はO(n)のようにはい、それはO(n)となりますです – XPLOT1ON

+0

複雑さを取り除くための銀色の弾丸はありません。時にはリテラル式も記述できません。この場合、あなたは正しいです、 'O(N * lg2N)'です。 –

答えて

13

それはO(n)です:

外側のループはO(logn)反復を持って、inから始まり、各反復上半分ますので、。

今度は、内側のループの繰り返し回数を考える:外側のループの最初の繰り返しで

  • 、内側のループは(i==n以降)n反復を持っています。
  • 外側ループの2番目の反復では、内側ループはn/2回の反復(i==n/2以降)です。 log(n)「番目(最終的な)外側ループの反復において

  • ...

  • 、内側ループは(i==1以降)1回の反復を有します。

    我々が得るすべての内側ループの反復を合計

:内部ループのための

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

です。外ループとはみなされません。 – Rudra

+0

@Rudraまあ、 'i'が1(外側ループの最後の反復)に達すると、内側ループは0から1になります。つまり、1回の反復があります。 – Eran

+0

ありがとうございます。 外部ループはlog(n)による計算を増加しています。なぜ我々はそれを考慮していない。 – Rudra

関連する問題