はい(いいえ)です。 Big Oの定義に厳密に従えば、2番目のアルゴリズムはO(n*log(n))
ですが、より良い結び付きを持っていることがわかります。
最初に、最初のループのアイデアを見てみましょう。各ループ反復を計算単位と呼びますと、合計計算量はsum(sum(1 from 0 to N) from 0 to log2(N))
であり、ちょうどN log2(N)
(たぶん1つ外れている)と言えるでしょう。この結果は、ループの最初のセットがO(N log(N))
であることを示しています。
今度は2番目のセットです。上記の手順を繰り返すと、sum(sum(1 from 0 to *a*) from 0 to log2(N)) = (log2(2 N) log2(4 N)) <= k [log(N)]^2
となるので、2番目のアルゴリズムはO(log^2(N))
(ポリログと呼ばれます)です。
k N log(N)
(いくつかのkの場合)は依然として第2のアルゴリズムの上限ですので、厳密にはまだO(N log(N)
です。ここ
ランタイムの期待成長のイメージである:
![growth plot](https://i.stack.imgur.com/N8heU.png)
赤、ループの最初のセットであり、緑色は、ループの第二のセットであり、青色は2N log(N)
あります。