さまざまなforループの実行時間を分析していますが、知識が増えるにつれて、この問題を理解したいと思っています。私は「印刷される星の数」と呼ばれるこのエクササイズを持っています:
for (int i = N; i > 1; i = i/2) System.out.println("*");
選択する答えはA: ~log N B: ~N C: ~N log N D: ~0.5N^2
だから答えはAで、私はそれに同意する必要がありますが、反対側に.. N = 500
何だろう Log N
それでは? 2.7になります。だから私たちがそれを言うとどうなる_N=500
上記の演習では?それは間違いなく2.7以上の星を印刷するでしょうか?それはどのように関連していますか?
Forループが次のようになっている場合、
for (int i = 0; i < N; i++)
N
星を印刷します。
私はここでこれについての説明を見つけたいと思っています。多分私はこれらすべてのことを間違って解釈していて、それについて悪い方法で考えています。前もって感謝します。
対数の底の重要な特徴を見落としました。
i
は各反復で2で除算されるため、実行時間は2を底とする対数です。そして
ログ2(500)〜8.9
あなたが見ているのは
ログ10(500)〜2.7
(10を底とする対数)
ちなみに、ランタイムのディスカッションでベースがしばしば省略される理由(そしてあなたの計算機にはおそらくログ用のボタンがありません2)は、対数計算のメカニズムにより、異なる基数が定数因子に対応するため、とにかく定数因子を無視している場合は関係ありません。簡単に計算できます:
ログa(x)=ログb(x)/ログb(a)
Michael Borgwardtの回答 に加えて、各回答の前のチルダ文字は「比例する」と読む必要があります。したがって、Nを2倍にすると(たとえば、500から1000に)、実行時間(またはこの場合、印刷される星の数)が(log1000/log 500)に等しい係数で増加することがわかります。これは、使用するベースから独立しています。