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) 的区别
f = Ω(log n) 和 g = O(n) 是 g(n) = O(f (n))