O(n)和O(log(n))之间的差异 - 哪个更好,什么是O(log(n))?

时间:2012-04-29 03:57:43

标签: algorithm data-structures complexity-theory big-o logarithm

这是我在数据结构和每个讲座/ TA讲座的第一门课程,我们谈论O(log(n))。这可能是一个愚蠢的问题,但如果有人能够向我解释这究竟是什么意思,我会很感激!?

6 个答案:

答案 0 :(得分:68)

这意味着有问题的东西(通常是运行时间)以与其输入大小的对数一致的方式缩放。

Big-O notation并不意味着完全等式,而是绑定。例如,以下函数的输出都是O(n):

f(x) = 3x
g(x) = 0.5x
m(x) = x + 5

因为当你增加x时,它们的输出都会线性增加 - 如果f(n)g(n)之间的比例为6:1,那么{{1}之间的比率也会大约为6:1 }和f(10*n)等等。


至于g(10*n)O(n)是否更好,请考虑:如果O(log n),则n = 1000(对于log-base-10)。你宁愿让你的算法运行:1000秒,还是3秒?

答案 1 :(得分:11)

对于大小为n的输入,O(n)的算法将执行n的每个步骤,而O(log(n))的另一算法将执行大约log(n)的步骤}。

显然log(n)小于n因此复杂性O(log(n))算法更好。因为它会快得多。

答案 2 :(得分:5)

对于简短的答案,O(log n)优于O(n)

现在O(log n)到底是什么?

通常,当提到大O表示法时, log n 是指以2为底的对数(以相同的方式 ln 表示以e为底的对数)。这个以2为底的对数是指数函数的反函数。 指数函数增长非常快,我们可以直观地推断出它的逆函数会做正相反的事情,即增长非常慢。

例如

x = O(log n)

我们可以将n表示为,

n = 2 x

还有

2 10 = 1024→lg(1024)= 10

2 20 = 1,048,576→lg(1048576)= 20

2 30 = 1,073,741,824→lg(1073741824)= 30

n 中的大增量只会导致log(n)很小的增长

另一方面,对于O(n)的复杂度,我们得到线性关系

log 2 n的因数应随时替换为n的因数。

为进一步巩固这一点,我在Algorithms Unlocked By Thomas Cormen

中遇到了一个示例

考虑2台计算机:A和B

两台计算机都有一个在数组中搜索值的任务 假设要搜索的数组有1000万个元素

计算机A-这台计算机每秒可以执行10亿条指令,并且有望使用复杂度为O(n)的算法执行上述任务。我们可以估计这台计算机完成任务所花费的时间为

n /(指令p秒)→10 7 / 10 ^ 9 = 0.01秒

计算机B-这台计算机慢得多,每秒只能执行1000万条指令。期望计算机B使用复杂度为O(log n)的算法执行上述任务。我们可以估计这台计算机完成任务所花费的时间为

log(n)/(指令p秒)→log(10 7 )/ 10 7 = 0.000002325349

通过此插图,我们可以看到,尽管计算机A比计算机B更好,但是由于计算机B使用的算法,它可以更快地完成任务。

我认为现在应该很清楚为什么O(log(n))比O(n)快很多

答案 3 :(得分:3)

http://en.wikipedia.org/wiki/Big_oh

O(log n)更好。

答案 4 :(得分:3)

O(logn)表示算法的最大运行时间与输入大小的对数成正比。 O(n)表示算法的最大运行时间与输入大小成正比。

基本上,O(某事物)是算法指令数量(原子数)的上限。因此,O(logn)比O(n)更紧密,并且在算法分析方面也更好。但所有O(logn)的算法也是O(n),但不是倒退......

答案 5 :(得分:1)

正式定义:

g(x)= O(f(x))< =>对于每个x> 1,存在x0和常数C. x0,| g(x)| < = C | f(x)|。

因此,如果你发现问题P的算法A的复杂度为O(f(n)), 您可以说算法将执行的步数渐近或等于f(n),当n通常是输入大小时。 (n可以是任何东西)

进一步阅读:http://en.wikipedia.org/wiki/Big_O_notation。