時間複雜度和空間複雜度是度量算法效率的常用指標
時間度量
- 事後統計,不常用
- 事前統計影響因素:
算法策略 問題規模 程序語言 代碼質量 機器執行指令的速度
撇開軟硬件的影響,算法運行工作量的大小隻依賴於問題的規模(通常用整數n表示)
一個算法是由控制結構(順序,分支,循環三種)和原操作(指固有數據類型的操作)構成,則算法時間取決於兩者的綜合效果。
爲了便於比較同一問題的不同算法,通常從算法中選取一種對於所研究問題來說是基本操作的原操作,以該基本操作重複執行的次數作爲算法的時間度量。
算法的時間複雜度記做 T(n)=O(f(n))
它表示隨問題規模n的增大,算法執行時間的增長率和 f(n) 的增長率相同
原操作的執行次數與包含他的語句的執行次數相同
- {++x; s = 0; }
- for( i = 1 ; i <= n ; ++i ) { ++x ; s += x;}
- for( j = 1 ; j <= n ; ++j )
for( k = 1 ; k <= n ; ++k ) { ++x ; s += x;}
含基本操作“x+1”的語句的頻度分別爲1,n和n^2,所以這三個程序段的時間複雜度分別爲O(1)、O(n)、O( n^2 ) ,分別稱爲常量階,線性階和平方階。
有些情況下,算法中基本操作重複執行的次數還隨問題的輸入數據集不同而不同。例如在冒泡排序算法中,“交換序列中相鄰兩個整數”這個基本操作執行次數可能爲0,或者O(n^2)。這類算法時間複雜度有兩種表示方法:一是考慮所有情況下時間複雜度的期望值(麻煩,而且出現概率難確定,所以不常用);另一種是以最壞的情況下的時間複雜度作爲該算法的時間複雜度。
空間複雜度
S(n)=O(f(n))
存儲空間,工作空間(計算等),輔助存儲空間等
空間複雜度感覺不怎麼常用。。。不研究了。。。。
參考 嚴蔚敏,吳偉民編著的《數據結構》