演算法效率的度量是通過時間複雜度和空間複雜度來描述的。
乙個語句的頻度是指該語句在演算法中被重複執行的次數。演算法中所有語句的頻度之和記作t(n),它是該演算法問題規模n的函式,時間複雜度主要分析t(n)的數量級。演算法中的基本運算(最深層迴圈內的語句)的頻度與t(n)同數量級,所以通常釆用演算法中基本運算的頻度 f(n)來分析演算法的時間複雜度。因此,演算法的時間複雜度也記為:t(n)=o(f(n))
上式中「o」的含義是t(n)的數量級,其嚴格的數學定義是:若t(n)和f(n)是定義在正整數集合上的兩個函式,則存在正常數c和n0,使得當n>=n0時,都滿足0 <= t(n) <= c * f(n)。注意:取f(n)中隨n增長最快的項將其係數置為1作為時間複雜度的度量。例如,fi(n) = a * n3 + b * n2 + c * n,則其時間複雜度為o(n3)。演算法的時間複雜度不僅依賴於問題的規模n,也取決於待輸入資料的性質(如輸入資料元素的初始狀態)。例如:在陣列a[0...n-1]中,查詢給定值k的演算法大致如下:
i=n-1;
while( i>=0 && (a[i]!=k) )
i--; // 語句(3)
return i;
此演算法中的語句(3)(基本運算)的頻度不僅與問題規模n有關,還與輸入例項中a 的各元素取值及k的取值有關:
若a中沒有與k相等的元素,則語句(3)的頻度 f(n)=n。
若a的最後乙個元素等於k,則語句(3)的頻度f(n)是常數0。
最壞時間複雜度是指在最壞情況下,演算法的時間複雜度。
平均時間複雜度是指所有可能輸入例項在等概率出現的情況下,演算法的期望執行時間。
最好時間複雜度是指在最好情況下,演算法的時間複雜度。
一般總是考慮在最壞情況下的時間複雜度,以保證演算法的執行時間不會比它更長。
在分析乙個程式的時間複雜性時,有以下兩條規則:
a) 加法規則
t(n) = t1(n) + t2(n) = o(f(n)) + o(g(n)) = o(max(f(n), g(n)))
b) 乘法規則
t(n) = t1(n) * t2(n) = o(f(n)) * o(g(n)) = o( f(n) * g(n) )
常見的漸近時間複雜度有:
o(1)
演算法的空間複雜度s(n),定義為該演算法所耗費的儲存空間,它是問題規模n的函式。漸近空間複雜度也常簡稱為空間複雜度,記作s(n)=o(g(n))。乙個上機程式除了需要儲存空間來存放本身所用指令、常數、變數和輸入資料外,也需要一些對資料進行操作的工作單元和儲存一些為實現計算所需資訊的輔助空間,若輸入資料所佔空間只取決於問題本身,和演算法無關,則只需分析除輸入和程式之外的額外空間。演算法原地工作是指演算法所需輔助空間是常量,即o(1)。
演算法度量方法 時間複雜度及空間複雜度
以前對這方面是一知半解,終於在一次大眾點評的筆試中受到刺激。步入正題 什麼樣的演算法才是高效的演算法?想必所有的人都這麼想過 用最少的錢,花做最短的時間,買到最多的東西。同樣,用最少的記憶體空間,花最短的時間解決問題的演算法就是。因此我們考慮用時間和空間來衡量乙個演算法的效率。首先我們來考慮如何利用...
演算法時間複雜度和空間複雜度
在進行演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進行分析t n 隨著n的變化情況並確定t n 的數量級。演算法的時間複雜度,也就是演算法的時間度量,記作 t n o f n 它表示隨著問題規模n的增大,演算法執行時間的增長率和f n 的增長率相同,稱作演算法的漸近時間複雜度,簡稱...
演算法時間複雜度和空間複雜度
執行演算法所需要的時間 空間複雜度 執行演算法所需要的記憶體空間 常見時間複雜度 例如 常數階o 1 線性階o n 平方階o n 2 立方階o n 3 對數階o log2n nlog2n階o nlog2n 指數階o n n 效率從大到小 o 1 o log2n o n o nlog2n o n 2 ...