@alestanis は、コメントよりもはるかに正確なこの問題の分析のように見えるものを提供してくれましたが、それでも完全に正しいとは思いません。
i
内側のループによって生成されたの値を出力する小さなテスト プログラムを作成しましょう。
#include <iostream>
void inner(double k) {
double i;
i = 0.0;
while(i < k) {
i ++;
i = i * i;
std::cout << i << "\n";
}
}
int main() {
inner(1e200);
return 0;
}
これを実行すると、次の結果が得られます。
1
4
25
676
458329
2.10066e+011
4.41279e+022
1.94727e+045
3.79186e+090
1.43782e+181
1.#INF
反復回数が対数である場合、特定の数に到達するための反復回数は、制限内の桁数に比例する必要があります。たとえば、対数の場合、1e181 に到達するには約 180 回の反復が必要であり、何らかの (かなり小さい) 定数係数を与えるか取る必要があります。ここでは明らかにそうではありません。科学表記法で結果の指数を見ると簡単にわかるように、これは反復ごとに桁数が約 2 倍になります。
私は絶対に確信しているわけではありませんが、内側のループを O(log N) ではなく O(log log N) のようなものにすると思います。外側のループがおそらく O(N) であることを意図していることに同意するのはかなり簡単だと思います (ただし、現在は 1 回だけ実行するように記述されています) O(N log log N)
。
実用的な観点から、多くの場合、本質的に定数として扱うことができることを追加する義務があると感じてO(log log N)
います。上記のように、典型的な倍精度浮動小数点数で指定できる上限は、わずか 11 回の繰り返しで到達します。そのため、ほとんどの実用的な目的では、全体的な複雑さは として扱うことができますO(N)
。
[おっと -- 私がこれを書いているときに彼が答えたことに気付かなかったが、@jwpat7 は私とほぼ同じ結論に達したようだ. 彼/彼女に称賛を。]