算法是爲求解一個問題須要遵循的,被清楚指定的簡單指令的集合。當一個求解某一問題的算法給定並指定是正確的,那麼對該算法的運行時間或所佔空間等資源量的肯定是重要的一步。算法
通常來講估計算法資源消耗所需的分析是一個理論問題,所以須要一套正式的系統架構。架構
數學基礎函數
爲了在函數中創建一些相對的級別( 簡單的比較函數值大小沒有什麼實際意義,因而咱們比較它們的相對增加率 ),通常給出四條定義:spa
①若是存在正常數 c 和 n,使得當N ≥ n時T(N) ≤ c f ( N ),則記爲 T(N) = O(f ( N ))。排序
②若是存在正常數 c 和 n,使得當N ≥ n時T(N) ≥ c g ( N ),則記爲 T(N) = Ω(g ( N ))。內存
③T(N)= Θ(f (N)), 當且僅當T(N) = O(f ( N ))和T(N) = Ω(f ( N ))。資源
④若是對每一正常數 c 都存在常數n,使得當N > n時 T(N)< c f(N),則T(N)= o(f(N))。有時也能夠說,若是T(N)= O(f(N))且T(N)≠ Θ(f(N)),則T(N)= o(f(N))。數學
上述四條定義簡單的給出了比較函數相對增加率的定義,爲了說明定義,這裏給出一個簡單的例子,咱們知道在N比較小的時候,500N 要大於N² 但N²以較快的增加率增加,因此N²最終的值大於500N,在這個例子中第一個定義是說,最後總會存在一個n值在它之後c * f ( N )老是至少與T(N)同樣大,從而忽視常數因子,則f ( N )至少與T(N)同樣大,能夠說500N = O(N²)這是大O標記法。能夠類推並總結,第一個定義T(N) = O(f ( N ))是指T(N)增加率大於或等於f(N)增加率,第二個定義T(N) = Ω(g ( N ))是指T(N)增加率大於g(N)增加率,第三個定義T(N)= Θ(f (N))是指T(N)增加率大於f(N)增加率,第四個定義T(N) = o(g ( N ))是指T(N)增加率大於g(N)增加率。 系統架構
給出一些典型的增加率排序(從低到高):c(常數),logN(對數),logⁿN(對數的n次方),N(線型的),NlogN, N²(二次的), N³(三次的), 2ⁿ(指數的)。基礎
當T(N) = O(f ( N ))時 f (N)= Ω(T(N)),咱們說T(N)是f(N)的一個下界,f(N)是T(N)的一個上界。
事實上N = O(N),N = O(N²),N = O(N³)都是成立的,但第一個是最佳選擇。寫法N = Θ(N)不只表示N = O(N)並且表示結果儘量的嚴密。當將相對增加率應用到算法分析時是重要的度量。
還有幾個重要的法則須要掌握:
法則一:
若是T₁(N) = O(f(N))且T₂(N) = O(g(N)),那麼
(a)T₁(N)+T₂(N)= O(f(N)+ g(N))(也能夠寫爲T₁(N)+T₂(N)= max(O(f(N),O( g(N))))。
(b)T₁(N)*T₂(N)= O(f(N)* g(N))。
法則二:
若是T(N)是一個n多項式,則T(N)=Θ(Nⁿ)(便可以忽略Θ中的常數和低階項,事實上在大O中也同樣,將常數和低階項寫入大O中是很差的習慣,在大O中任何簡化都是可能發生的)
法則三:
對任意常數n,logⁿN =O(N)。
在計算兩個函數的相對增加率時咱們總可以經過極限lim f(N)/g(N)(N → ∞)來計算,有時可用到洛必達法則。
❶極限是0:這意味着f(N)= o(g(N))。
❷極限是c ≠ 0:這意味着f(N)= Θ(g(N))。
❸極限是∞,這意味着g(N)= o(f(N))。
模型
咱們須要一個計算模型從而在構架中分析算法,計算模型基本上是一臺標準的計算機,順序執行指令。
該模型有一個標準的簡單指令系統,如加法,乘法,比較和賦值等。模型不一樣於實際計算機的有:1,咱們假設模型機作任何簡單的工做都花費一個單位時間(簡單工做不包括如矩陣求逆或排序等明顯沒法用一個單位時間完成的想象的操做,同時咱們須要明白現實生活中不是全部的運算都剛好花費一樣的時間)。2,假設模型內存無限(顯然這也是一個缺陷,無限的內存意味着不用考慮內存這個現實中可能存在的問題)