1. 程式人生 > 實用技巧 >資料結構之演算法分析O表示法

資料結構之演算法分析O表示法

演算法分析

最壞情況分析

通常評判演算法效能的三種情況:

  • 最佳情況
  • 平均情況
  • 最壞情況
    演算法在不同的情況下效能差異可能很大。比如一種簡單的線性搜尋演算法,它從資料集頭部遍歷到尾部查詢一個數據。最好情況是要查詢的元素在資料集的第一個位置,平均情況是可能在資料集中間的某個位置找到該元素,最壞情況是該元素位於資料集最後一個位置,需要遍歷所有元素才能找到該元素。

為什麼要考慮最壞情況

  • 許多演算法在最壞情況下會消耗相當長的時間
  • 考慮演算法在最佳情況下的效能無多大意義
  • 分析演算法在平均情況下的效能往往不易,甚至很難去界定哪種情況是平均情況。
  • 最壞情況可以告訴我們演算法效能的上限,分析一個演算法的最壞情況可以保證在其他任何情況下,此演算法的表現都不會比最壞情況差,其他情況肯定比最壞情況要好。

O表示法

O表示法是用來表示演算法效能的最常見最正式的標記法。在一定情況下,O表示法指明瞭一個函式的上限值。對於大小為n的資料,我們用函式f(n)來表示它的效能,0我們需要關注的是當演算法處理的資料量變得無窮大時,演算法的效能去進一個什麼樣的值,當n無窮大時,它可以用來描述演算法的效率到底有多高。

O表示法簡單規則

  • 常數項用O(1)表示,當分析一個演算法的執行時間時,如果知道無論它處理多大的資料量,它都至少得消耗一段固定的時間,那麼就可以用常數項表示此固定的時間,對於某些常數c,正式的表述為: O( c ) = O(1)
  • 常數因子往往被忽略。
    O( cT ) = cO(T) = O(T)
  • 加法運算取最大值。例如,有兩個順序執行的任務,其執行時間分別為:n和n^2
    執行結果表示為O(n)+O(n ^2)。
    根據規則,可以簡化為O(n^2)。
    正式表述為:
    O(A) + O(B) = O(A+B) = max(O(A)+O(B))
  • 乘法結果不需要改變。如果一個任務的執行引起了另一個任務的迭代執行,可以運用此規則。如在一個巢狀迴圈中,外層迭代為A,內層迭代為B,如果都為O(n),則結果為O(n^2).
    真是的表述為:
    O(A) O(B) = O(AB)

計算的複雜度

O表示法能夠描述一個演算法的複雜度。
常見覆雜計算的複雜度:

O(1)-----------------從一個數據集中獲取第一個元素
O(lg n)--------------將一個數據集分成兩半,然後將分開的每一半再分成兩半,以此類推,遍歷一個數據集
O(n)-----------------遍歷一個數據集
O(n lg n)--------------將一個數據集分成兩半,然後將分開的每一半再分成兩半,以此類推,遍歷一個數據集,此過程中同時遍歷一遍每一半資料
O(n^2)--------------遍歷一個數據集中的每個元素的同時遍歷另一個數量級相同的資料集
O(lg n)--------------將一個數據集分成兩半,然後將分開的每一半再分成兩半,以此類推,遍歷一個數據集
O(2^n)--------------為一個數據集生成其可能的所有子集
O(n!)--------------為一個數據集生成其可能的所有排列組合

在這裡插入圖片描述