web-dev-qa-db-ja.com

単一のforループランタイム説明問題

さまざまな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星を印刷します。

私はここでこれについての説明を見つけたいと思っています。多分私はこれらすべてのことを間違って解釈していて、それについて悪い方法で考えています。前もって感謝します。

8
owwyess

対数の底の重要な特徴を見落としました。

iは各反復で2で除算されるため、実行時間は2を底とする対数です。そして

ログ2(500)〜8.9

あなたが見ているのは

ログ10(500)〜2.7

(10を底とする対数)

ちなみに、ランタイムのディスカッションでベースがしばしば省略される理由(そしてあなたの計算機にはおそらくログ用のボタンがありません2)は、対数計算のメカニズムにより、異なる基数が定数因子に対応するため、とにかく定数因子を無視している場合は関係ありません。簡単に計算できます:

ログa(x)=ログb(x)/ログb(a)

34

Michael Borgwardtの回答 に加えて、各回答の前のチルダ文字は「比例する」と読む必要があります。したがって、Nを2倍にすると(たとえば、500から1000に)、実行時間(またはこの場合、印刷される星の数)が(log1000/log 500)に等しい係数で増加することがわかります。これは、使用するベースから独立しています。

8