对于以下伪代码,最糟糕的时间复杂度大O符号是什么? (假设函数调用是O(1))我对大O表示法很新,所以我不确定答案但是我在考虑O(log(n))因为while循环参数每次乘以2或者那只是O(loglog(n))?或者我错了两个方面?任何输入/帮助都是值得赞赏的,我正试图掌握大O符号的概念,因为我刚刚开始学习最糟糕的时间复杂度。谢谢!
i ← 1
while(i<n)
doSomething(...)
i ← i * 2
done
答案 0 :(得分:7)
如果i
每次都加倍,那么循环执行的次数是您在到达i
之前可以加倍n
的次数。或者以数学方式编写,如果x
是循环执行的次数,我们有2^x <= n
。求解x
会得到x <= log_2(n)
。因此,循环执行的次数为O(log(n))
答案 1 :(得分:5)
i
呈指数增长,因此循环将以对数时间完成, O(log(n))
答案 2 :(得分:3)
O(log(n))在想要根据数n表示该算法的时间复杂度时是正确的。然而,在计算机科学中,复杂性通常以输入的大小,即比特数来表示。那么你的算法就是线性的,即在O(k)中,其中k是输入大小。
通常,其他操作(如加法)也称为线性而非对数。对数复杂度通常意味着算法不必考虑完整输入。 (例如二元搜索)。
如果这是练习的一部分,或者你想在计算机科学背景下讨论算法的复杂性,那么这种差异很重要。
另外,如果一个人想要真正迂腐:大整数的比较不是一个恒定的时间操作,如果你正在考虑通常的整数类型,算法基本上是恒定的时间,因为它只需要高达32或64迭代。