· 時間複雜度(time complexity)
0,1,1,2,3,5,8,13,21,34…
數列中每個數都是其兩個直接前項的和。
f nf_
fn的生成規則:
f n=
=\left\f_+f_ &n>1 & \\ 1&n=1 & \\ 0 & n=0 \end\right.
fn=⎩⎨
⎧fn
−1+
fn+1
10
n>1n
=1n=
0fibonacci數增長速度幾乎與2的冪增長速度相同。一般而言,fn≈
20.694nfn
≈2
0.69
4n計算機的運算速度一直以每18個月翻一番的速度迅猛提公升。
以基本操作次數來表徵演算法的執行時間,是一種簡化。因為一次操作所耗費的時間主要依賴於特定的處理器,還可能依賴於快取策略等細節。
衡量演算法的效能,需要一種簡潔的、與機器無關的標準。為此,我們通常採用對演算法的基本操作次數進行計數的方式來表徵演算法的執行時間,而基本操作次數是演算法輸入規模的函式。
簡化來講,當輸入規模是n
nn時,演算法的執行時間為o(n
3)
o(n^)
o(n3
)(讀作,大onon
on立方)。
大o
oo符號的精確定義。假設當演算法輸入規模是n時,兩個演算法的執行時間分別為f(n
)f(n)
f(n)
和g (n
)g(n)
g(n)。令f(n
)f(n)
f(n)
和g (n
)g(n)
g(n)
均為從正整數到正實數的函式。如果存在乙個常數c
>
0c>0
c>
0,使得f(n
)≤c⋅
g(n)
f(n)\leq c\cdot g(n)
f(n)≤c
⋅g(n
)成立,則我們稱f=o
(g
)f=o(g)
f=o(g)
(意味著「f
ff增長的速度慢於g」)
大o符號用於描述函式漸進行為的數學符號。更確切地說,它是用另乙個(通常更簡單的)函式來描述乙個函式數量級的漸近上界。即用乙個大o,在其括號()中,用另乙個函式來描述原來的函式的數量級的漸進上界。
某個演算法的時間複雜度是o(1
),就說明這是乙個優秀的演算法。
某個演算法的時間複雜度是o
(logn),就說明這是乙個良好的演算法。
某個演算法的時間複雜度是o
(n),就說明這個演算法還不錯。
某個演算法的時間複雜度是o
(n2),就說明這個演算法差一些了。
無窮大接近
例如,解決乙個規模為 n 的問題所花費的時間(或者所需步驟的數目)為:
t (n
)=4n
2−2n
+2
t(n)=4n^-2n+2
t(n)=4
n2−2
n+2當n
nn增大時,n^2項將開始佔主導地位,而其他各項可以被忽略。
舉例說明:當 n = 500,4n^2; 項是 2n 項的1000倍大,因此在大多數場合下,省略後者對表示式的值的影響將是可以忽略不計的。
進一步看,如果我們與任一其他級的表示式比較,n^2; 項的係數也是無關緊要的。
這樣,大o符號就記下剩餘的部分,寫作:
t(n)∈o(n^2)
並且我們就說該演算法具有2階的時間複雜度。
t(n)=o(n^2)
無窮小接近
大o也可以用來描述數學函式估計中的誤差項。例如:
e x=
1+x+
12x2
+o(x
3)
e^=1+x+\fracx^+o(x^)
ex=1+x
+21
x2+o
(x3)
當 x→0 時
這表示,如果 x 足夠接近於0,那麼誤差(ex=
1+x+
12x2
e^=1+x+\fracx^
ex=1+x
+21
x2的差)的絕對值小於 x3x^
x3的某一常數倍。
時間複雜度是同一問題可用不同演算法解決,而乙個演算法質量的優劣將影響到演算法乃至程式的效率。
在電腦科學中,演算法的複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串的長度的函式。
時間複雜度常用大o符號表述,不包括這個函式的低階項和首項係數。使用這種方式時,時間複雜度可被成為是漸進的,它考察當輸入值大小趨近無窮時的結果。
計算方式
一般情況下,演算法中基本操作重複執行的次數,是問題規模n
nn的某個函式,用t(n
)t(n)
t(n)
表示,若有某個輔助函式f(n
)f(n)
f(n)
,使得t(n
)/f(
n)
t(n)/f(n)
t(n)/f
(n)的極限值(n
nn趨於無限大)為不等於0的常數,則成f(n
)f(n)
f(n)
是t (n
)t(n)
t(n)
同數量級函式。記作t(n
)=o(
f(n)
)t(n)=o(f(n))
t(n)=o
(f(n
)),稱o (f
(n))
o(f(n))
o(f(n)
)為演算法的漸進時間複雜度,簡稱時間複雜度。
隨著規模n的增大,演算法執行的時間的增長率和f(n)的增長率成正比,所以f(n)越小,演算法的時間複雜度越低,演算法的效率越高。
演算法導論學習筆記 (1)
乙個acm若菜,趁著acm淡季,開始學習演算法導論了,經過一年的acm學習,逐漸的發現,學東西,深入才是王道,以前學習乙個演算法,總是看懂了就開始做題,到後來才發現很多題目,會演算法,卻不知道是用這個演算法,這就是演算法理解的不到位的後果,從今天開始,定下目標 1.深入系統的學習演算法,2.學會紙上...
演算法導論筆記 1
略過 2.1 插入排序這種方法類似於數學歸納法,只不過,數學歸納法是無限迭代的,而該方法在for或者while語句停止時,歸納停止,運用這種方法,可以幫我們有條理的證明某演算法在for或while迴圈上正確完備的達到了我們的期望。2.2 分析演算法 演算法的複雜度通常有以下幾種情況 2.3 設計演算...
演算法導論學習筆記 1 基礎排序演算法
最近從頭開始學習演算法導論,作為乙個非計算機專業的學生,我的目的也就是為了找工作的時候能多點籌碼 但是學習過程中還是有不少收穫的,順便也能練習下python程式設計水平,因此記錄下學習內容 第一章是演算法基礎,這裡介紹了2種排序方法 插入排序和歸併排序 例子還算比較淺顯易懂。對於插入排序,可以用乙個...