O(n)和O(log(n))之间的区别-哪个更好,O(log(n))到底是什么?


70

这是我关于数据结构的第一门课程,我们每讲一门讲座/ TA讲座O(log(n))。这可能是一个愚蠢的问题,但是如果有人可以向我确切解释这是什么意思,我将不胜感激!



2
哇,1429年投票?对于我的Wikipedia链接,我将满意其中的一半。

给我我需要的信息。
MadHatter

Answers:


90

这意味着所讨论的事物(通常是运行时间)的缩放比例与其输入大小的对数一致。

Big-O表示法并不意味着确切的方程式,而是一个界限。例如,以下函数的输出均为O(n):

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

因为当你增加X,它们的输出都增加而线性-如果有一个6:1之间的比例f(n)g(n),也将有大约6:1的比例之间f(10*n)g(10*n)等。


至于是否O(n)还是O(log n)比较好,可以考虑:如果n = 1000,那么log n = 3(日志基-10)。您希望算法运行哪一个:1000秒或3秒?


29
很好解释。另外,我想补充一些信息,甚至对那些不知道的人来说都是对数。在计算机科学中登录n意味着,我需要将数字加2才能得到n。想象一下,如果n =16。我们的指数将比实际n值小得多。应该是4。希望这是有道理的。在上述由琥珀的例子,她正在给一个类似的例子,但提高10〜3的动力
马声音

1
+1-尽可能少的单词就可以最清晰的解释。谢谢。
techfoobar 2014年

1
还值得注意的是,Big-O通常指的是任何边界,不一定是最紧密的边界(即,最小的g(x)使得f(x)= O(g(x)))。f(x)g(x)m(x)也为O(n ^ 2)。但是在性能分析的上下文中,我们希望tightest边界(即,限制给定算法性能曲线的最小函数)为我们提供算法性能的“最坏情况”构想。
Minh Tran

@马声在您的示例中使用2 ** 4,而在Amber的代码中示例是10 ** 3;如何确定参数?
MadHatter

该链接显示了具有所有不同复杂度的图形:bigocheatsheet.com
silver_mx

24

对于简短的答案,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)的复杂度,我们得到线性关系

随时应将因数2 n取为n的因数。

为了进一步巩固这一点,我在《Thomas Cormen解锁的算法》中遇到了一个例子

考虑两台计算机: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)快得多


16

对于大小的输入n,的一种算法O(n)将按与之成比例地执行步骤n,而另一种算法的O(log(n))则将按大致执行步骤log(n)

显然log(n)小于,n因此复杂度算法O(log(n))更好。既然会更快。



5

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

基本上,O(某物)是算法指令数(原子指令)的上限。因此,O(logn)比O(n)更严格,并且在算法分析方面也更好。但是所有的O(logn)算法也都是O(n),但不是向后...


4
“ O(n)比O(logn)更严格,并且在算法分析方面也更好” ...显然,O(log(n))比O(n)好。我认为您是相反的意思。
LuxuryMode 2012年

3

正式定义:

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.