1. 程式人生 > >演算法複雜度,時間複雜度,空間複雜度 整理彙總

演算法複雜度,時間複雜度,空間複雜度 整理彙總

演算法複雜度,時間複雜度,空間複雜度

演算法複雜度:

演算法在編寫成可執行程式後,執行時所需要的資源,資源包括時間資源和記憶體資源。

其中時間資源對應時間複雜度,記憶體資源對應空間複雜度。

考察一個演算法主要從時間複雜度空間複雜度來衡量

時間複雜度

時間頻度 T(n)

一個演算法執行所消耗的時間,與演算法中語句執行次數成正比,一個演算法中語句執行次數稱為語句頻度,或時間頻度,記為T(n)

時間複雜度

可以模糊的認為演算法的時間複雜度是執行演算法所需要的計算工作量。演算法的時間複雜度是描述演算法的時間頻度T(n)與問題規模n的變化規律,較準確的定義是:

一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用T(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)T(n)的同數量級函式。記作T(n)=O(f(n)),稱O(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度。

另外,上面公式中用到的 Landau符號其實是由德國數論學家保羅·巴赫曼(Paul Bachmann)在其1892年的著作《解析數論》首先引入,由另一位德國數論學家艾德蒙·朗道(Edmund Landau)推廣。Landau符號的作用在於用簡單的函式來描述複雜函式行為,給出一個上或下(確)界

。在計算演算法複雜度時一般只用到大O符號,Landau符號體系中的小o符號、Θ符號等等比較不常用。這裡的O,最初是用大寫希臘字母,但現在都用大寫英語字母O;小o符號也是用小寫英語字母oΘ符號則維持大寫希臘字母Θ

**$T (n) = Ο(f (n))$** 表示存在一個常數C,使得在當n趨於正無窮時總有 $T (n) ≤ C * f(n)$。簡單來說,就是T(n)在n趨於正無窮時最大也就跟$f(n)$差不多大。也就是說當n趨於正無窮時**$T (n)$**的上界是**$C * f(n)$。**

其雖然對f(n)沒有規定,但是一般都是取儘可能簡單的函式。例如,

O(2n2+n+1)=O(3n2+n+3)=O(7n2+n)=O(n2),一般都只用O(n2)

表示就可以了。注意到大O符號裡隱藏著一個常數C,所以f(n)裡一般不加係數。如果把T(n)當做一棵樹,那麼O(f(n))所表達的就是樹幹,只關心其中的主幹,其他的細枝末節全都拋棄不管。

在各種不同演算法中,若演算法中語句執行次數為一個常數,則時間複雜度為O(1),另外,在時間頻度不相同時,時間複雜度有可能相同,如T(n)=n2+3n+4T(n)=4n2+2n+1它們的頻度不同,但時間複雜度相同,都為O(n2)

​ 在各種不同演算法中,若演算法中語句執行次數為一個常數,則時間複雜度為O(1),另外,在時間頻度不相同時,時間複雜度有可能相同,如

T(n)=n2+3n+4T(n)=4n2+2n+1

它們的頻度不同,但時間複雜度相同,都為O(*n*2)。 按數量級遞增排列,常見的時間複雜度有:常數階O(1),對數階O(log2n),線性階O(n), 線性對數階O(nlog2n),平方階O(n2)立方階O(n3),…, k次方階O(nk),指數階O(2n)隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。

常見的演算法時間複雜度由小到大依次為: