私はインタビューのためにいくつかのビッグO表記を見直しており、私はこの問題に遭遇します。単純な時間の複雑さO(nlogn)
for i = 1 to n do:
j = i
while j < n do:
j = 2 * j
単純なのですか?外部ループはnステップを提供する。これらのステップのそれぞれは、j=i
という1つのステップO(1)を実行し、その後、whileループに対してj = i
ステップからlog(n-j)またはlog(n-i)を実行します。時間の複雑さはO(nlogn)だと思ったが、答えはO(n)だった。
実行している時間は、およそ以下の合計です:Σ 1 + ログ(N/I)iに対する1からnまでΘ(n)は、ここで
が答えです。
今はちょっと錆びています。 log(n/i)
はどこから来ますか?私はlog(n) - log(i) = log(n/i)
を知っているが、私はlog(n-i)log(n) - log(i)をログすると思った。時間の複雑さはどのようにO(nlogn)ではないのですか?私は何かシンプルなものを見逃していると確信していますが、私はこれを数時間前から見つめています。私は心を失い始めています。
ソース:ここでは、この問題のソースはBerkeley CS 170, Fall 2009, HW 1
編集です:もう少しそれについて考えた後、それは内部ループの時間複雑性はログ(N/I)であることを意味します。それぞれの内側ループはn-i回実行されますが、私はそれぞれのループを2倍にします。内側のループが常に0から始まっていれば、log(n)がありますが、ループする必要のないループの数はlog(i)です。 log(n)-log(i)はlog(n/i)である。
が提供する答えに追加するにしてから、[ここを参照してください]走った(httpsで始まっている場合、それは
O(n.log(n))
だろう。stackexchange.com/questions/74412/how-to-show-sum-limits-i-1n-log-left-fracni-right-thetan)この合計はどのようにO(n) – RSon1234ありがとう@ RSon1234これは私のものです探している! –