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