前言
本篇文章收錄於專輯: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))表示。
用圖來表示:
Θ同時定義了上界和下界,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))表示。
用圖來表示:
O只定義上界,只要f(n)不大於c*g(n),就能夠說 f(n)=O(g(n))。
好比說,對於插入排序,咱們說它的時間複雜度是O(n^2),可是,若是用Θ來表示,則必須分紅兩條:
- 最壞的狀況下,它的時間複雜度爲Θ(n^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))表示。
用圖來表示:
o表示僅僅是大O去掉等於的狀況,其餘行爲與大O如出一轍。
Ω
Ω定義了算法的下界,與O正好相反。
用函數來表示:
對於f(n),存在正數n0、c,使得當 n>=n0 時,始終存在 0 <= c*g(n) <= f(n),則咱們能夠用 f(n)=Ω(g(n))表示。
用圖來表示:
Ω只定義下界,只要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))表示。
用圖來表示:
ω表示僅僅是大Ω去掉等於的狀況,其餘行爲與大Ω如出一轍。
通俗理解
符號 | 含義 | 通俗理解 |
---|---|---|
Θ | 精確的漸近行爲 | 至關於「=」 |
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就能夠了,只不過在別人提到Θ、Ω、ω咱們知道是什麼含義就能夠了。
前面幾節講了這麼多,其實,仍是隻涉及了很簡單的算法複雜度。
那麼,常見的算法複雜度有哪些呢?
下一節,咱們接着聊。
關注公號主「彤哥讀源碼」,解鎖更多源碼、基礎、架構知識。