Time complexity 此for循环的时间复杂度:for(i=2;i<;N;i=i*i)?

Time complexity 此for循环的时间复杂度:for(i=2;i<;N;i=i*i)?,time-complexity,big-o,complexity-theory,Time Complexity,Big O,Complexity Theory,我们现在正在学习时间复杂性,我在这个例子中遇到了很多麻烦 for (i = 2; i < n; i = i * i) { ... do something ... } (i=2;i

我们现在正在学习时间复杂性,我在这个例子中遇到了很多麻烦

for (i = 2; i < n; i = i * i)
{
     ... do something ...
}
(i=2;i { …做点什么。。。 } 教授说是O(sqrt(N)),但我不确定我是否相信。毕竟,如果N=16,它只运行2次,不是4次,对吗

我的解决方法: 2^(2k)=N,其中k是循环运行的次数。 除去常数因子,k运行log(N)次。
我哪里出了问题?谢谢你对这件事的任何建议。

当你使用大O符号时,你是在谈论N趋于无穷大时的行为<代码>N=16不够大

尽管如此,我认为你的教授是不对的。循环

for (int i = 0; i*i < N; ++i) { ...}
(inti=0;i*i 时间复杂度为O(sqrt(N))


对于您的循环,您是对的,它应该是O(log(log(N)),因为循环在i=2,4,16,…,2^k。。。这2^k>=N.

你是对的,你的指导老师错了(至少,他们的界限不严格),我喜欢你所做的分析,但我认为你在最后一步得出了错误的结论

很高兴你看到了所有的中间值。你是对的,j取的值的序列是2,4,16,256,等等。如果我们将事物重写为二的幂,请注意序列取的是值

21、22、24、28

更一般地说,在循环的k次迭代之后,j的值是22k(与您最初编写的22k相反)。这意味着要确定循环迭代次数,您需要确定

22k=n

在这里,你必须取两个对数来解决这个问题:

22k=n

2k=lg n

k=lg n

因此,循环的迭代次数是O(logn),低于两个O(√n) 你的老师给你的和你得出的O(logn)


值得一提的是,(在一个数字降为常数之前,你可以取它的平方根O(logn)次),因此,如果你反向运行并不断平方一个值,你会看到O(logn)出现,这也就不足为奇了。

O(logn)不是2^(2^k)吗?也许我没想清楚。但是如果是这样的话,称之为O(sqrt(N))和O(logn)在技术上仍然是正确的,因为big-O只是一个上界。好吧,我已经很晚了,但为什么这个答案还没有被接受?(-_-)