【发布时间】:2012-05-09 07:39:39
【问题描述】:
这是我的第一门数据结构课程,每次讲座/助教讲座,我们都会谈论O(log(n))。这可能是一个愚蠢的问题,但如果有人能向我解释这到底是什么意思,我将不胜感激!?
【问题讨论】:
标签: algorithm data-structures complexity-theory big-o logarithm
这是我的第一门数据结构课程,每次讲座/助教讲座,我们都会谈论O(log(n))。这可能是一个愚蠢的问题,但如果有人能向我解释这到底是什么意思,我将不胜感激!?
【问题讨论】:
标签: algorithm data-structures complexity-theory big-o logarithm
简而言之,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) 快得多
【讨论】:
O(logn) 表示算法的最大运行时间与输入大小的对数成正比。 O(n) 表示算法的最大运行时间与输入大小成正比。
基本上,O(something) 是算法指令数(原子指令)的上限。因此,O(logn) 比 O(n) 更严格,并且在算法分析方面也更好。但是所有O(logn)的算法也是O(n),但不是倒过来的……
【讨论】:
正式定义:
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。
【讨论】:
对于大小为n 的输入,O(n) 的算法将执行与n 成比例的步骤,而O(log(n)) 的另一个算法将大致执行log(n) 的步骤。
显然log(n) 小于n 因此复杂度算法O(log(n)) 更好。因为它会更快。
【讨论】:
http://en.wikipedia.org/wiki/Big_oh
O(log n) 更好。
【讨论】:
这意味着有问题的事物(通常是运行时间)以与其输入大小的对数一致的方式缩放。
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 秒?
【讨论】:
f(x)、g(x)、m(x) 也是 O(n^2)。但在性能分析的上下文中,我们希望tightest 界限(即,限制给定算法性能曲线的最小函数)为我们提供算法性能的“最坏情况”概念。
2 ** 4,而在Amber 的代码中,示例是10 ** 3;如何确定参数?