O、Θ、Ω、o、ω,别再傻傻分不清了!

file

前言

本篇文章收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。java

你好,我是彤哥,一个天天爬二十六层楼还不忘读源码的硬核男人。算法

前面几节,咱们一块儿学习了算法的复杂度如何分析,并从最坏、平均、最好以及不能使用最坏状况全方位无死角的剖析了算法的复杂度,在咱们表示复杂度的时候,一般使用大O来表示。数组

可是,在其余书籍中,你可能还见过Θ、Ω、o、ω等符号。数据结构

那么,这些符号又是什么意思呢?架构

本节,咱们就来解决这个问题。函数

读音

咱们先来纠正一波读音:学习

  • O,/əʊ/,大Oh
  • o,/əʊ/,小oh
  • Θ,/ˈθiːtə/,theta
  • Ω,/oʊˈmeɡə/,大Omega
  • ω,/oʊˈmeɡə/,小omega

是否是跟老师教得不太同样^^spa

数学解释

Θ

Θ定义了一种精确的渐近行为(exact asymptotic behavior),怎么说呢?翻译

用函数来表示:code

对于f(n),存在正数n0、c一、c2,使得当 n>=n0 时,始终存在 0 <= c1*g(n) <= f(n) <= c2*g(n),则咱们能够用 f(n)=Θ(g(n))表示。

用图来表示:

file

Θ同时定义了上界和下界,f(n)位于上界和下界之间,且包含等号。

好比说,f(n) = 2n^2+3n+1 = Θ(n^2),此时,g(n)就是用f(n)去掉低阶项和常数项得来的,由于确定存在某个正数n0、c一、c2,使得 0 <= c1*n^2 <= 2n^2+3n+1 <= c2*n2,固然,你说g(n)是2*n2也没问题,因此,g(n)实际上知足这个条件的一组函数。

好了,若是Θ你能理解了,下面四个就好理解了。

O

O定义了算法的上界。

用函数来表示:

对于f(n),存在正数n0、c,使得当 n>=n0 时,始终存在 0 <= f(n) <= c*g(n),则咱们能够用 f(n)=O(g(n))表示。

用图来表示:

file

O只定义上界,只要f(n)不大于c*g(n),就能够说 f(n)=O(g(n))。

好比说,对于插入排序,咱们说它的时间复杂度是O(n^2),可是,若是用Θ来表示,则必须分红两条:

  1. 最坏的状况下,它的时间复杂度为Θ(n^2);
  2. 最好的状况下,它的时间复杂度为Θ(n)。

这里的n2只是g(n)这一组函数中最小的上界,固然,g(n)也能够等于n3。

不过,咱们通常说复杂度都是指的最小的上界,好比,这里插入排序的时间复杂度若是说是O(n^3),从理论上来讲,也没问题,只是不符合约定罢了。

插入排序最好的状况就是数组自己就是有序的。

o

o定义的也是算法的上界,不过它不包含等于,是一种不精确的上界,或者称做松上界(某些书籍翻译为非紧上界)。

用函数来表示:

对于f(n),存在正数n0、c,使得当 n>n0 时,始终存在 0 <= f(n) < c*g(n),则咱们能够用 f(n)=o(g(n))表示。

用图来表示:

file

o表示仅仅是大O去掉等于的状况,其余行为与大O如出一辙。

Ω

Ω定义了算法的下界,与O正好相反。

用函数来表示:

对于f(n),存在正数n0、c,使得当 n>=n0 时,始终存在 0 <= c*g(n) <= f(n),则咱们能够用 f(n)=Ω(g(n))表示。

用图来表示:

file

Ω只定义下界,只要f(n)不小于c*g(n),就能够说 f(n)=Ω(g(n))。

好比,对于插入排序,咱们能够说它的时间复杂度为Ω(n),不过,这一般没有什么意义,由于插入排序在最好的状况下不多,基本都是在最坏状况或者平均状况。

ω

ω一样定义的是下界,只不过不包含等于,是一种不精确的下界,或者称做松下界(某些书籍翻译为非紧下界)。

用函数来表示:

对于f(n),存在正数n0、c,使得当 n>n0 时,始终存在 0 <= c*g(n) < f(n),则咱们能够用 f(n)=ω(g(n))表示。

用图来表示:

file

ω表示仅仅是大Ω去掉等于的状况,其余行为与大Ω如出一辙。

通俗理解

符号 含义 通俗理解
Θ 精确的渐近行为 至关于“=”
O 上界 至关于“<=”
o 松上界 至关于“<”
Ω 下界 至关于“>=”
ω 松下界 至关于“>”

小结

为了帮助同窗们快速查阅英文资料,彤哥特意把这几节涉及到的英语单词汇总了一下:

汉语 英文
复杂度 complexity
时间复杂度 time complexity
空间复杂度 space complexity
渐近分析 asymptotic analysis
最坏状况 the worst case
最好状况 the best case
平均状况 the average case
精确的渐近行为 exact asymptotic behavior
低阶项 low order terms
常数项(前置常数) leading constants
松上界 loose upper-bound

后记

本节,咱们分别从读音、数学、通俗理解等三个方面阐述了Θ、O、o、Ω、ω的含义,并在最后给出了这几节涉及到的术语对应的英文,有了这些英文,你也能够快速地查阅这方面的资料。

不过,在咱们平时与人交流的过程当中,你们仍是习惯于使用大O表示法,一来它表示最坏状况,最坏状况一般能够直接表明算法的复杂度,二来它比较好书写。

因此,咱们只须要记住大O就能够了,只不过在别人提到Θ、Ω、ω咱们知道是什么含义就能够了。

前面几节讲了这么多,其实,仍是只涉及了很简单的算法复杂度。

那么,常见的算法复杂度有哪些呢?

下一节,咱们接着聊。

关注公号主“彤哥读源码”,解锁更多源码、基础、架构知识。

相关文章
相关标签/搜索