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

file

前言

本篇文章收錄於專輯:http://dwz.win/HjK,點擊解鎖更多數據結構與算法的知識。java

你好,我是彤哥,一個天天爬二十六層樓還不忘讀源碼的硬核男人。算法

前面幾節,咱們一塊兒學習了算法的複雜度如何分析,並從最壞、平均、最好以及不能使用最壞狀況全方位無死角的剖析了算法的複雜度,在咱們表示複雜度的時候,一般使用大O來表示。數組

可是,在其餘書籍中,你可能還見過Θ、Ω、o、ω等符號。數據結構

那麼,這些符號又是什麼意思呢?架構

本節,咱們就來解決這個問題。函數

讀音

咱們先來糾正一波讀音:學習

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

是否是跟老師教得不太同樣^^url

數學解釋

Θ

Θ定義了一種精確的漸近行爲(exact asymptotic behavior),怎麼說呢?spa

用函數來表示:.net

對於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*n^2,固然,你說g(n)是2*n^2也沒問題,因此,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)。

這裏的n^2只是g(n)這一組函數中最小的上界,固然,g(n)也能夠等於n^3。

不過,咱們通常說複雜度都是指的最小的上界,好比,這裏插入排序的時間複雜度若是說是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就能夠了,只不過在別人提到Θ、Ω、ω咱們知道是什麼含義就能夠了。

前面幾節講了這麼多,其實,仍是隻涉及了很簡單的算法複雜度。

那麼,常見的算法複雜度有哪些呢?

下一節,咱們接着聊。

關注公號主「彤哥讀源碼」,解鎖更多源碼、基礎、架構知識。

相關文章
相關標籤/搜索