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


8

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

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


これは以前の質問とどう違うのですか?forループの漸近実行時間
gnat 2014

これは、漸近的な実行時間とは関係ありません。
owwyess 14

1
このオプションは、10を底とする対数ではなく、2を底とする対数を意味する場合にのみ意味があります。
Kilian Foth、2014

3
Log 500 = 2.7を取得すると想定しているベースは何ですか?そしてそのベースはあなたのコードのどこかに現れますか?Nbあなたはこれまで、異なるベースのログで異なる一定の要因にすぎません
Caleth

2
@Caleth対数の底コードに表示されます。i = i/2ループは2の繰り返し乗算を逆転させているため、底は2です。

回答:


34

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

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

ログ2(500)〜8.9

あなたが見ているのは

ログ10(500)〜2.7

(10を底とする対数)

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

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


これは理にかなっているので、実際には対数についての私の知識の欠如です。シンプルで明確な答えをありがとう。
owwyess 2014

@Michael Borgwardtに感謝します。上記の例では、N = 500の可能性があります。対数の底が10の計算機でそれを計算するにはどうすればよいですか?
owwyess 14

2
@owwyessは、log10の結果をlog10(2)で除算します
ラチェットフリーク

すみません、自分を混乱させ、log10(10)で割りました。皆さんありがとう。
owwyess 14

2
前の段落で述べた定数係数は、基数2で約3.322です。つまり、10進数の1桁に2進数で3.3桁が必要です。あるいは、33桁の2進数は10進数で最大10桁です。
キリン船長、2014

8

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


2
チルドは、比例ではなく、おおよその意味であると常に理解していた。本質的に、~はの省略形です
DavorŽdralo2014

1
比例はあるシンボルではありません~~同値関係または指示するために使用されたおおよその等式を(はWikipediaのページをご覧くださいチルダ)。
バクリウ2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.