这个函数的大O符号是什么?

时间:2016-02-01 17:00:47

标签: algorithm big-o time-complexity

对于以下伪代码,最糟糕的时间复杂度大O符号是什么? (假设函数调用是O(1))我对大O表示法很新,所以我不确定答案但是我在考虑O(log(n))因为while循环参数每次乘以2或者那只是O(loglog(n))?或者我错了两个方面?任何输入/帮助都是值得赞赏的,我正试图掌握大O符号的概念,因为我刚刚开始学习最糟糕的时间复杂度。谢谢!

i ← 1
while(i<n)
    doSomething(...)
    i ← i * 2
done

3 个答案:

答案 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迭代。