常見算法的時間複雜度 Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…

關於時間複雜度,有一個公式:T (n) = Ο(f (n))。
爲了便於比較同一問題的不同算法,通常從算法中抽取一種或者多種有代表性的基本操作,再以這些基本操作重複執行的次數與問題規模的關係T(n) 作爲算法的時間性量度。
如果T(n) 和 f(n) 是n 的函數,當n →∞ 時,有T(n) / f(n) → c (常數c ≠ 0),記作:T(n) = O(f(n)),稱O(f(n)) 爲算法的漸近時間複雜度,簡稱時間複雜度。

算法的空間複雜度:
一個算法實現所佔存儲空間大致包含三方面:
1. 指令、常數、變量所佔用的存儲空間;
2. 輸入數據所佔用的存儲空間;
3. 算法執行時所需的輔助空間;
前兩者是必須的,通常將算法執行時所需的輔助空間作爲分析算法空間複雜度的依據:S(n) = O(f(n)),其中f(n)的規則與時間複雜度一致。

所以,我們就先來看看 O(1) 是什麼意思?算法的時間複雜度:

 

1.O(1)

 

O(1) 也就是最低時間複雜度。代表的是一個常量值。也就是說耗時,耗空間與輸入數據的大小無關。無論輸入數據增大多少倍,耗時是不變的。

相關算法舉例:哈希算法(不考慮衝突的情況),無論在數據量多麼大,都是 O(1)。

 

2.O(n)

 

O(n) 理解起來也很簡單,就是算法的時間複雜度隨着數據量的增大幾倍,耗時也增大幾倍。

常見的算法舉例:遍歷算法。

 

3.O(n^2)

 

就代表數據量增大 n 倍時,耗時增大 n 的平方倍,這是比線性更高的時間複雜度。比如冒泡排序,就是典型的 O(n^2) 的算法,對 n 個數排序,需要掃描 n × n 次。

O(n^2) 也有人用 O(n²) 表示。這兩個表示是一樣的。

 

4.O(logn)

 

當數據增大 n 倍時,耗時增大 logn 倍(這裏的 log 是以 2 爲底的,比如,當數據增大 256 倍時,耗時只增大 8 倍,是比線性還要低的時間複雜度)。二分查找就是 O(logn)的算法,每找一次排除一半的可能,256 個數據中查找只要找 8 次就可以找到目標。

 

5.O(nlogn)

 

O(nlogn) 就是 n 乘以 logn,當數據增大 256 倍時,耗時增大 256*8=2048 倍。這個複雜度高於線性低於平方。歸併排序就是 O(nlogn) 的時間複雜度。

常見的時間複雜度有:常數階 O(1),對數階 O(log2n),線性階 O(n),線性對數階 O(nlog2n),平方階 O(n2),立方階 O(n3),…,k 次方階 O(nk),指數階 O(2n) 等。我就不一一列舉說明了。

根據經驗,我們應該儘可能選用多項式階 O(nk) 的算法,而不希望用指數階的算法。

常見的算法時間複雜度由小到大依次爲:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)。

 

上圖是常見的算法時間複雜度舉例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章