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

Posted

技术标签:

【中文标题】O(n) 和 O(log(n)) 之间的区别 - 哪个更好,O(log(n)) 到底是啥?【英文标题】:Difference between O(n) and O(log(n)) - which is better and what exactly is O(log(n))?O(n) 和 O(log(n)) 之间的区别 - 哪个更好,O(log(n)) 到底是什么? 【发布时间】:2012-05-09 07:39:39 【问题描述】:

这是我的第一门数据结构课程,每次讲座/助教讲座,我们都会谈论O(log(n))。这可能是一个愚蠢的问题,但如果有人能向我解释这到底是什么意思,我将不胜感激!?

【问题讨论】:

***.com/questions/487258/…的可能重复 【参考方案1】:

简而言之,O(log n) 优于 O(n)

O(log n) 到底是什么?

一般来说,当提到大 O 表示法时,log n 是指以 2 为底的对数,(同样 ln 表示以 e 为底的对数)。这个以 2 为底的对数是指数函数的倒数。 一个指数函数增长非常迅速,我们可以直观地推断出它的反函数会完全相反,即增长非常缓慢。

例如

x = O(log n)

我们可以将 n 表示为 ,

n= 2x

还有

210 = 1024 → lg(1024) = 10

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

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

n 的大幅增加只会导致 log(n) 的微小增加

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

log2n 的因数应随时超过 n 的因数。

为了进一步巩固这一点,我在Algorithms Unlocked By Thomas Cormen 中遇到了一个示例

考虑两台计算机:A 和 B

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

计算机 A- 这台计算机每秒可以执行 10 亿条指令,预计使用复杂度为 O(n) 的算法来执行上述任务。我们可以将这台计算机完成任务所需的时间近似为

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

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

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

通过这张图,我们可以看到,虽然计算机 A 比计算机 B 好很多,但由于 B 使用的算法,它完成任务的速度要快得多。

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

【讨论】:

【参考方案2】:

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

基本上,O(something) 是算法指令数(原子指令)的上限。因此,O(logn) 比 O(n) 更严格,并且在算法分析方面也更好。但是所有O(logn)的算法也是O(n),但不是倒过来的……

【讨论】:

“O(n) 比 O(logn) 更严格,并且在算法分析方面也更好”......显然 O(log(n)) 比 O(n) 更好。我想你的意思是相反的。【参考方案3】:

正式定义:

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

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

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

【讨论】:

【参考方案4】:

对于大小为n 的输入,O(n) 的算法将执行与n 成比例的步骤,而O(log(n)) 的另一个算法将大致执行log(n) 的步骤。

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

【讨论】:

【参考方案5】:

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

O(log n) 更好。

【讨论】:

【参考方案6】:

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

Big-O notation 并不意味着一个精确 方程,而是一个有界。例如,以下函数的输出都是 O(n):

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

因为随着 x 的增加,它们的输出都会线性增加 - 如果 f(n)g(n) 之间的比率为 6:1,那么 f(10*n)g(10*n) 之间的比率也将约为 6:1,并且以此类推。


至于O(n)O(log n)哪个更好,考虑:如果n = 1000,那么log n = 3(对于log-base-10)。您希望算法运行哪个时间:1000 秒还是 3 秒?

【讨论】:

很好解释。另外,我想为那些不知道的人添加一些关于对数是什么的信息。在计算机科学中登录 n 意味着,我需要将数字 2 提高到的指数才能得到 n。所以想象一下,如果 n = 16。我们的指数会比实际的 n 值小得多。应该是 4。希望这是有道理的。在上面 Amber 的示例中,她给出了一个类似的示例,但将 10 提高到 3 的幂。 +1 - 用最少的单词给出最清晰的解释。谢谢。 另外值得注意的是,Big-O 通常指 any 界,不一定是最紧密的界(即最小 g(x) 使得 f(x) = O (g(x)))。 f(x)g(x)m(x) 也是 O(n^2)。但在性能分析的上下文中,我们希望tightest 界限(即,限制给定算法性能曲线的最小函数)为我们提供算法性能的“最坏情况”概念。 @Horse Voice 在您的示例中,您使用2 ** 4,而在Amber 的代码中,示例是10 ** 3;如何确定参数? 此链接显示了具有所有不同复杂性的图表:bigocheatsheet.com

以上是关于O(n) 和 O(log(n)) 之间的区别 - 哪个更好,O(log(n)) 到底是啥?的主要内容,如果未能解决你的问题,请参考以下文章

O(1), O(n), O(logn), O(nlogn) 的区别

数组中的大多数元素分治 O(N.log(N))

f = Ω(log n) 和 g = O(n) 是 g(n) = O(f (n))

O(n log n) 时间和 O(1) 空间复杂度与 O(n) 时间和 O(n) 空间复杂度的算法

常见算法

几种排序算法