したがって、より単純なケースが得られます。
for (int count = 0; count < n; count ++)
{
for (int count2 = 1; count2 < n; count2 ++)
// ^^^^^^^^^
{
System.out.println(count, count2);
}
}
ここでは、外側のループが実行n
時間、内側のループが実行n
時間であるため、単純に乗算n
しn
て O(n 2 ) を取得します。(このコード フラグメントの内側のループが時間だけ実行されるという事実はn-1
、順序に違いはありません。)
count2
問題は、毎回倍増するあなたの例では、内側のループの関数は何ですか? 内側のループの実行時間の関数を呼び出しましょうf(n)
。したがって、big-O は O(nf(n)) になります。
内側のループを見てみましょう。1
time if n=1..2
、2
times if n=3..4
、3
times if n
is upto 8
、4
times if n
is upto 16
、5
times if n
is uptoを実行し32
ます。2=>1
、4=>2
などをマッピングするこの関数は何8=>3
ですか?
注意すべきことは2 = 2^1
、、、、4 = 2^2
など8 = 2^3
です16 = 2^4
。あなたが望むのは、2 の累乗でレイズすることの反対であり、これは 2 を底とする対数です (ただし、大きな O の場合、対数は問題になりません)。
したがってf(n) = log(n)
、O(n log(n))があります。
編集: 何が起こっているかを把握する最も簡単な方法は、プログラムをさまざまな値で実行することですn
。たとえば、n=8
次の出力が得られます。
(0,1)、(0,2)、(0,4)
(1,1)、(1,2)、(1,4)
(2,1)、(2,2)、(2,4)
(3,1)、(3,2)、(3,4)
(4,1)、(4,2)、(4,4)
(5,1)、(5,2)、(5,4)
(6,1)、(6,2)、(6,4)
(7,1)、(7,2)、(7,4)
反復回数 = n log2(n) = 8 * 3 = 24
. これは、n
が のべき乗である正確な関係です2
。それ以外の場合、関係は正確ではありません。たとえば、同じ出力が得られますが (最終行のバー)、コードはまだ O(n log(n)) です。これは、内側のループの反復回数が になるようにn=7
定数 を選択できるためです。k=2
<= k n log(n)