78

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

4

6 回答 6

105

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

Big-O 表示法并不意味着一个精确的方程,而是一个bound。例如,以下函数的输出都是 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),请考虑: if n = 1000, then log n = 3(对于 log-base-10)。您希望算法运行哪个:1000 秒还是 3 秒?

于 2012-04-29T04:01:45.820 回答
38

简而言之,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 的因数。

为了进一步巩固这一点,我在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) 快得多

于 2019-02-11T10:58:06.630 回答
21

对于 size 的输入n,一个算法O(n)会按比例执行步骤n,而另一个算法O(log(n))会大致执行步骤log(n)

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

于 2012-04-29T04:08:56.867 回答
7

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

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

于 2012-04-29T04:08:55.723 回答
5

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

O(log n) 更好。

于 2012-04-29T04:04:28.587 回答
3

正式定义:

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

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

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

于 2012-07-05T15:13:24.887 回答