前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你真的了解大O符号吗?

你真的了解大O符号吗?

作者头像
ACM算法日常
发布2020-06-02 16:09:57
1.4K0
发布2020-06-02 16:09:57
举报
文章被收录于专栏:ACM算法日常ACM算法日常

对于一个算法,一般来说我们能够通过计算来确定它的复杂度,比如遍历一个链表结构,链表的元素个数为

n

,显然复杂度是

O(n)

,对于这个大

O

符号,我们再熟悉不过。

可是,如果有人说这个复杂度是

\Theta(n)

,又或者是

\Omega(n)

,你还能理解是什么意思吗?

让我们一起复习一下渐近符号。

我们常需要分析一个算法的性能如何。例如我们说快速排序在最坏情况下性能为

O(n^2)

,而平均情况下性能为

O(nlogn)

。这些讨论中会用到

O

这种渐近记号。

在《算法导论》第三章介绍了5种渐近记号:

\Theta

O

\Omega

o

\omega

,其中3个是拉丁符号,另外2个是大写字母

O

和小写字母

o

\Theta(g(n))

是函数集合,其算术定义有点类似极限的定义:

\Theta(g(n))

={

f(n)

: 存在正常数

c_1

,

c_2

n_0

,对所有

n \geq n_0

,有

c_1g(n) \leq f(n) \leq c_2g(n)

}。

O(g(n))

则是取上界,

\Omega

取下界,另外一种说法是前者是最坏情况,后者是最好的情况,比如对于插入排序来说,最好情况是

O(n)

,我们可以说插入排序的复杂度是

\Omega(n)

,插入排序的最坏情况是

O(n^2)

,所以一般来说我只会说插入排序是

O(n^2)

复杂度的。

算术定义不是很便于理解,直观地理解:当n特别大的时候,如果

f(n)

夹在

c_1g(n)

c_2g(n)

之间,就说

f(n)

属于

\Theta(g(n))

虽然是集合,但是我们更喜欢写成

f(n) = \Theta(g(n))

。下图可以更直观的理解三者的区别。

这个图中,最左边是

\Theta

符号,中间是大

O

符号,最右边是

\Omega

符号,从图中可以看出,前者是后两者的公共部分,限制更多,我们用的最多的大

O

是算法的上界。

《算法导论》第三章末尾也说了,渐近记号在历史上出现了一些演变。最早大家都用

O

,符号;后来

Knuth

建议用

\Theta

\Omega

;在今天我们知道

\Theta

是最准确的符号,但大家还是都习惯用

O

符号。所以当我们谈到快排的平均复杂度是

O(nlog(n))

的时候,我们心里清楚其实准确的写法是

\Theta(nlog(n))

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ACM算法日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档