算法复杂度及渐进符号
算法復雜度及漸進符號
一、算法復雜度
每一個程序在運行時,都需要占用一定的計算機資源,比如內存,磁盤,這些稱之為空間。
計算過程中需要判斷,循環執行某些邏輯,周而反復,這些是時間。
那么我們可以通過算法復雜度理論來衡量算法的效率。
復雜度有兩個維度:時間和空間。
我們要選擇復雜度低的算法,衡量好空間和時間的消耗,選出適合特定場景的算法。
二、算法規模
例如:我們要計算1+2+3+…+100,那么最直觀的寫法
package mainimport "fmt"func sum(n int) int {total := 0// 從1加到N,1+2+3+4+5....for i := 1; i <= n; i++ {total += i}return total }func main() {fmt.Println(sum(100)) }當n是一個比較小的數字的時候計算很快,但是當n接近無限大的時候,計算很慢。
所以,算法衡量的是在不同問題規模n下,算法的速度。
在這里,因為要循環計算n-1次,而當n無限大的時候,常數項基本忽略不計,所以這個算法的時間復雜度我們用**O(n)**表示。
我們還有另外的計算方式:
func sum2(n int) int {total := ((1 + n) * n) / 2return total }這次算法只需要執行1次,所以這個算法的時間復雜度是O(1)??梢钥闯?#xff0c;時間復雜度為**O(1)的算法優于算法復雜度為O(n)**的算法
算法的優先級排列如下,一般排在上面的要優于排在下面的:
三、漸進符號
如何量化一個復雜度,到底有多復雜,計算機抽象出了幾個復雜度漸進符號。
漸進符號如下: O,ο,Θ,Ω,ω
分別讀作:Omicron(大歐),omicron(小歐),Theta(西塔),Omega(大歐米伽),omega(小歐米伽)。
3.1.漸進符號:θ
假設算法A的運行時間表達式:
T(n) = 5 * n^3 + 4 * n^2如果問題規模n足夠大,那么低次方的獎項將無足輕重,運行時間取決于高次方的第一項:5 * n^3。
隨著n的增大,第一項中的常數也不重要了,所以算法A的運行時間T(n)約等于n^3,記為:
T(n) = θ(n^3)Θ 的數學含義:
設 f(n) 和 g(n) 是定義域 n 為自然數集合的函數,兩個函數同階,也就是當 n 無窮大時,f(n)/g(n) 等于某個大于0的常數 c。
也可以說,存在正常量 c1,c2 和 n0,對于所有 n >= n0,有 0 <= c1 * g(n) <= f(n) <= c2 * g(n)。
那么可以記 f(n) = Θ(g(n)),g(n) 是 f(n) 的漸進緊確界。
3.2. 漸進符號:
O 的數學含義:
設 f(n) 和 g(n) 是定義域 n 為自然數集合的函數, f(n) 函數的階不高于 g(n) 函數的階。
也可以說,存在正常量 c 和 n0,對于所有 n >= n0,有 0 <= f(n) <= c * g(n)。
那么可以記 f(n) = O(g(n))。g(n) 是 f(n) 的漸進上界。
3.3. 漸進符號:Ω
Ω 的數學含義:
設 f(n) 和 g(n) 是定義域 n 為自然數集合的函數, f(n) 函數的階不低于 g(n) 函數的階。
也可以說,存在正常量 c 和 n0,對于所有 n >= n0,有 0 <= cg(n) <= f(n)。
那么可以記 f(n) = Ω(g(n))。g(n) 是 f(n) 的漸進下界。
3.4. 漸進分析
上面的定義很復雜,我們可以來看圖:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eAR81BRb-1646902918628)(E:\筆記\Go數據結構與算法\Go筆記圖片\degree.png)]
當 n 值超過某個值時,f(n) 被 g(n) 兩條線夾在中間,那么 g(n) 就是漸進緊確界。
如果 g(n) 的線在上面,就是漸進上界。
如果 g(n) 線在下面,就是漸進下界。
我們一般會評估一個算法的漸進上界 O,因為這表示算法的最壞情況,這個上界可以十分不準確,但我們一般會評估得足夠準確,比如:
設 f(n) = 5 * n^3 + 4 * n^2,我們要求漸進上界。那么:
f(n) = O(n^3),g(n) = n^3 f(n) = O(n^4),g(n) = n^4兩個 g(n) 都是上界,因為令 c = 5 時都存在:0 <= f(n) <= c * g(n))。
我們會取乘方更小的那個,因為這個界更逼近 f(n) 本身,所以我們一般說 f(n) = O(n^3),算法的復雜度為大歐 n 的三次方,表示最壞情況。
同理,漸進下界 Ω 剛好與漸進上界相反,表示最好情況。比如還是這個假設:
設 f(n) = 5 * n^3 + 4 * n^2,我們要求漸進下界。那么:
f(n) = Ω(n^3),g(n) = n^3 f(n) = Ω(n^2),g(n) = n^2兩個 g(n) 都是下界,因為令 c =5 時都存在:0 <= cg(n) <= f(n)。
我們準確評估的時候,要取乘方更大的那個,因為這個界更逼近 f(n) 本身,所以我們一般說 f(n) = Ω(n^3),算法的復雜度為大歐米伽 n 的三次方,表示最好情況。
我們發現當 f(n) = Ω(n^3) = O(n^3) 時,其實 f(n) = Θ(n)。
另外兩個漸進符號 ο 和 ω 一般很少使用,指不那么緊密的上下界。
也就是評估的時候,不那么準確去評估,在評估最壞情況的時候使勁地往壞了評估,評估最好情況則使勁往好的評估,但是它不能剛剛好,比如上面的結果:
f(n) = O(n^3),g(n) = n^3 f(n) = O(n^4),g(n) = n^4 f(n) = Ω(n^3),g(n) = n^3 f(n) = Ω(n^2),g(n) = n^2我們可以說:
f(n) = ο(n^4),g(n) = n^4 往高階的評估,不能同階 f(n) = ω(n^2),g(n) = n^2 往低階的評估,不能同階四、總結
| Θ | 緊確界 | 相當于"=" |
| O | 上界 | 相當于"<=" |
| ο | 非緊的上界 | 相當于"<" |
| Ω | 下界 | 相當于">=" |
| ω | 非緊的下界 | 相當于">" |
我們一般用 O 漸進上界來評估一個算法的時間復雜度,表示逼近的最壞情況。其他漸進符合基本不怎么使用。
緊確界 | 相當于"=" |
| O | 上界 | 相當于"<=" |
| ο | 非緊的上界 | 相當于"<" |
| Ω | 下界 | 相當于">=" |
| ω | 非緊的下界 | 相當于">" |
我們一般用 O 漸進上界來評估一個算法的時間復雜度,表示逼近的最壞情況。其他漸進符合基本不怎么使用。
總結
以上是生活随笔為你收集整理的算法复杂度及渐进符号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《自拍教程20》ffmpeg 音视频图像
- 下一篇: 【循序渐进学Python】Python中