回答:
上記のアルゴリズムの時間の複雑さは 、なぜなら あなたは一定の操作(println)をしていて、あなたは知っています: 、の意味 アルゴリズムの実行時間は一定です(他の部分も一定です。 呼び出されます)。
より明確にするために、この質問を見てください。
編集:Saeed Amiriが指摘したように、これは実際には 、漸近的に大きいので 、else
分岐は実際には行われません。if
一部は自明時定数であり、実行されます。参考までに残しておきますが、この回答の残りの部分は、たとえば、条件がである場合は正しいでしょうk < 100
。取り違えて申し訳ありません。
時間の複雑さは基本的にその回数のオーダーになります ネストされたfor
ループで増分されます。いくつかの余分なことが起こっていますが、それについて考えれば、それは一定の要因で遊んでいるだけです。何回 増加しますか?
いつ 、 は1だけ増加します。いつ、 さらに2回インクリメントされます。いつ、 増加します 追加の時間。それでは、。次に、内部ループの最後の反復により、k
インクリメントされます 回。
総計が増加します 回、または 回。そのことを思い出してください。そう、私たちはそれを持っています 増加します 合計時間。
線形である回数だけインクリメントされます ; エルゴ、これがすべてです。
else
は、前提条件の内容を確認せずに、一部に磨きをかけました。これを反映するように回答を編集しています。
どれどれ:
int j = 3;
一定時間O(1)かかります。
int k = j * n / 345
j変数とn変数の対数時間関数を取ります
if (k > 100)
一定時間O(1)かかります。
System.out.println("k: " + k);
kの対数時間関数をとります
for (int i=1; i<n; i*=2)
tがこのforループの反復回数である場合、iの値は次のように表せるため、nの対数時間関数Θ(log(n))を正確に取る:i = 2 t-1、ただしt = 1最初の反復において、ループは限り続けて2 T-1 <Nであり、ここでnは変更されません。
微積分では、2 t-1 <nの場合、t-1 <log 2(n)
そして、t-1 <log 2(n)の場合、t <log 2(n)+1
そして、各反復でtが1ずつ増加する場合、このforループ内のコードの実行時間の複雑さが一定、つまりO(1)の場合、このforループは実際にΘ(log(n))時間かかることがわかります。もちろん!
このforループ内には、別のforループがあります。
for (int j=0; j<i; j++)
k++;
これを分析しましょう:
k++;
一定の時間、つまりO(1)時間かかります。
したがって、内部のforループの実行時間の複雑さを分析することは興味深いことです。
どれどれ:
この内部forループのコードによると、この内部forループにはi回の反復があるように見えます。そのため、実行時間はO(i)ではなくΘ(i)です。これは、途中で壊れないためです。しかしことを覚えておいてI <N 、なぜならループの外側のを、ときに初めに、それは1回の反復を取るようにもかかわらず、I 1 =ときに、2回の反復をI 2 =ときに、4回の反復をiが4 =ときに、8回の反復をiが8 =。 ..などなど、行i * = 2の外側のforループの終わりで自分自身が2倍になるため、合計で1 + 2 + 4 + 8 + ...の繰り返しになりますが、i≥nまでしたがって、この内部forループで可能な最大反復回数は、最悪の場合のi = n-1のときです。したがって、内部forループの最後の実行で、n-1回の反復が実行されたので、その前に( n-1)/ 2回の反復とその前に(n-1)/ 4回の反復が実行され、その前に(n-1)/ 8回の反復が実行されたので、合計で次のように実行されました。
n-1 +(n-1)/ 2 +(n-1)/ 4 +(n-1)/ 8 ... =(n-1)(1 + 1/2 + 1/4 + 1/8 ...)=(n-1)(2)= 2n-2 =Θ(n)
1 + 1/2 + 1/4 + 1/8 ... = 2は、よく知られた幾何学的シーケンスの合計であることを思い出してください。
外側のforループはΘ(log(n))をとることを思い出してください
そして、内側のforループはΘ(n)をとります。
また、forループの内側のforループの実行時間の複雑さは、外側のforループの実行時間の複雑さに内側のforループの実行時間の複雑さを掛けたものであるため、thus(nlogn)の実行時間がかかります。
したがって、要約すると、この関数の実行時間はΘ(nlogn)です。
これがあなたの質問にうまく答え、アルゴリズムと関数の実行時の複雑さを分析する方法をよく教えてくれることを願っています。