Big O:依存関係のあるネストされたForループ


9

Big Oで宿題を与えられました。前のループに依存するforループが入れ子になっています。私は本当にそれを理解したいので、ここに私の宿題の質問の変更されたバージョンがあります:

sum = 0;
for (i = 0; i < n; i++ 
    for (j = 0; j < i; j++) 
        sum++;

私を後押ししているのはそのj < i部分です。ほぼ階乗のように実行されるようですが、追加されます。ヒントは本当にいただければ幸いです。


回答:


10

ですから、いくつかはっきりさせておきますが、big-O表記に興味があります。これは上限を意味します。つまり、実際よりも多くの歩数をカウントしても問題ありません。特に、アルゴリズムを変更して、

 ...
    for (j = 0; j < n; j++) 
 ...

nO(n2)

もちろん、上限を適切に見積もる必要があります。したがって、完了のために、下限を決定したいと思います。これは、より少ないステップを数えることを意味します。変更を検討してください

for (i = n/2; i < n; i++)
    for (j = 0; j < n/2; j++) 
        sum++;

n/2n2/4Ω(n2)n2Θ(n2)

詳細については、こちらをご覧ください


6
sum = 0;
for (i = 0; i < n; i++)
    for (j = 0; j < i; j++) 
        sum++;

これを追跡してみましょう:

  • i = 0の場合、内部ループは実行されません(0<0 == false)。
  • i = 1の場合、内部ループは1回実行されます(j == 0の場合)。
  • i = 2の場合、内部ループは2回実行されます。(j == 0およびj == 1の場合)。

したがってsum、このアルゴリズムは次の回数を増分します。

x=1nx1=0+1+2+3+4...+n1=n(n1)2

nn2n2n2θ(n2)O(n2) and Ω(n2)


3

これを説明できるか見てみましょう...

したがって、内部ループがjだった場合

ここで、最初の反復では、内側のループをn-(n-1)回実行します。2回目は、内側のループをn-(n-2)回実行します。N回目はn-(nn)回、つまりn回実行します。

内部ループを通過する回数を平均すると、n / 2回になります。

つまり、これはO(n * n / 2)= O(n ^ 2/2)= O(n ^ 2)と言えます

それは理にかなっていますか?


ちょっと変ですが、わかったと思います!ありがとう!

そのj < i部分が実際にj < i^2である場合、その部分の結果のOはn ^ 2/2になりますか?

まず、O(n ^ 2/2)= O(n ^ 2)であることに注意してください。これをj <i ^ 2に変更すると、最初の反復で(n-(n-1))^ 2を実行し、最後の反復でn ^ 2を実行します。内側のループのビッグO表記がどうなるか覚えていません。O(n ^ 2)はゆるい上限です。したがって、全体のゆるい上限はO(n ^ 3)になりますが、その内部ループはO(n ^ 2)よりも小さくなります。それは理にかなっていますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.