虽然@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
如果迭代次数是对数的,那么达到特定数字的迭代次数应该与限制中的位数成正比。例如,如果它是对数的,它应该需要大约 180 次迭代才能达到 1e181,给定或取一些(相当小的)常数因子。这显然不是这里的情况——通过查看科学记数法中结果的指数很容易看出,这大约是每次迭代的数字数量的两倍,其中对数意味着每次迭代大约增加一个数字。
我不是很确定,但我相信这会将内部循环置于 O(log log N) 之类的位置,而不仅仅是 O(log N)。我认为很容易同意外循环可能打算为 O(N) (尽管它目前被编写为只执行一次),将整体复杂性置于O(N log log N)
.
我觉得有必要补充一点,从实用的角度来看,O(log log N)
通常可以将其视为基本恒定的——如上所示,您可以使用典型的双精度浮点数指定的最高限制仅在 11 次迭代中达到。因此,对于大多数实际目的,整体复杂性可以被视为O(N)
.
[哎呀——在我写这篇文章的时候没有注意到他已经回答了,但看起来@jwpat7 已经得出了与我相同的结论。向他/她致敬。]