1. 演算法效率的度量
演算法執行的時間需通過依據該演算法編制程式在計算機上執行時所消耗的時間來度量。而度量乙個程式執行時間通常有兩種方法。
(1)事後統計法
因為計算機內部都有計時功能,有的甚至精確到毫秒級,不同演算法的程式可通過一組或若干組相同的統計資料以辨別優劣。但這種方法有兩個缺陷:一是必須先執行依據演算法編制的程式;二是所得時間的統計量依賴於計算機的硬體、軟體等環境因素,有時容易掩蓋演算法本身優劣。
(2)事前分析法
乙個用高階程式語言編寫的程式在計算機上執行時所消耗的是阿金取決於以下因素:
①依據演算法選用何種策略
②問題的規模,例如:求100以內還是1000以內的素數
③書寫程式的語言,對於同乙個演算法,實現語言的級別越高,執行效率越低;
④編譯程式所產生的機器**質量;
⑤機器執行指令的速度。
顯然,同乙個演算法用不同語言或者不同編譯程式編譯或者不同的計算機上執行,效率都不相同。這表明使用絕對的時間單位衡量演算法的效率是不合適的。撇開與計算機硬體、軟體相關的因素,可以認為乙個特定演算法「執行工作量」的大小,是依賴於問題的規模,或者說是問題規模的函式。
2. 基本操作的原操作
乙個演算法是由控制結構(順序、分支和迴圈3種)和原操作(指固有資料型別的操作),則演算法時間取決於兩者的綜合效果。為了比較同一問題的不同演算法,通常的做法是,從演算法中選取一種對於所有研究問題來說是基本操作的原操作,以該基本操作的重複執行次數作為演算法的時間度量。
顯然基本操作的原操作應是其重複執行次數和演算法的執行時間成正比的原操作,多數情況下它是最深迴圈內的語句中的原操作,它執行次數和包含它的語句頻度相同。語句的頻度指的是該語句重複執行的次數。
3. 時間複雜度
一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式f(n),進而分析f(n)隨n的變化情況並確定t(n)的數量級。這裡用"o"來表示數量級,給出演算法的時間複雜度。
它表示隨著問題規模的n的增大,演算法的執行時間的增長率和f(n)的增長率相同,這稱作演算法的漸進時間複雜度,簡稱時間複雜度。而我們一般討論的是最壞時間複雜度,這樣做的原因是:最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的上界,分析最壞的情況以估算演算法指向時間的乙個上界。
例1:
for(i = 1;i <= n; ++i)
for(j = 1; j <= n; ++j)
包含 「x 增 1」 基本操作的語句的頻度為:
例2:
for(i = 2; i <= n; ++i)
for(j = 2;j <= i-1; ++j)
包含 「x 增 1」 基本操作的語句的頻度為 1+2+3+…+n-2 = (1+n-2)×(n-2)/2 = (n-1)(n-2)/2 其時間複雜度為:
例3:
void bubble_sort(int a,int n) }
}// bubble-sort
最好情況:0次
最壞情況:1+2+3+…+n-1=n(n-1)/2
在資料結構中討論的時間複雜度,均指最壞的時間複雜度。平均時間複雜度為:
4. 時間複雜度的分析方法:
①時間複雜度就是函式中基本操作原操作所執行的次數
②一般預設的是最壞時間複雜度,即分析最壞情況下所能執行的次數
③忽略掉常數項
④關注執行時間的增長趨勢,關注函式式中增長最快的表示式,忽略係數
⑤計算時間複雜度是估算隨著n的增長函式執行次數的增長趨勢
⑥遞迴演算法的時間複雜度為:遞迴總次數 * 每次遞迴中基本操作所執行的次數
5. 常見時間複雜度
常數階,立方階
時間複雜度之間的關係為:
6. 空間複雜度
空間複雜度作為演算法所需儲存空間的量度,記作
其中n為問題的規模(或大小)。
程式**本身所佔空間對不同演算法通常不會有數量級之差別,因此在比較演算法時可以不加考慮;演算法的輸入資料量和問題規模有關,若輸入資料所佔空間只取決於問題本身,和演算法無關,則在比較演算法時也可以不加考慮;由此只需要分析除輸入和程式之外的額外空間。
若所需臨時空間不隨問題規模的大小而改變,則稱此演算法為原地工作。
例1:
float abc (float a,float b,float c)
float sum (float list ,int n)
以上兩個函式臨時空間不隨問題規模的大小而改變,其空間複雜度為:o(1),即:原地工作。
例2:
float rsum (float list , int n)
該遞迴函式臨時空間n大小而改變,其空間複雜度為: 時 空間複雜度
演算法中的基本操作的執行次數,稱為演算法的時間複雜度 我們計算時間複雜度,並不一定要計算所有執行次數,而是擇其大概次數就行了。即漸進計數。漸進計數就是說 1 已知常數次記為o 1 2 忽略 係數 即2n次 記為o n 3 大資料下忽略小資料 即 n 2 2n 1 記為o n 2 時間複雜度 也有最好...
演算法時空複雜度分析
目錄 1.時間複雜度 2.空間複雜度 3.常見的演算法複雜度 4.相關典型例題 5.總結 在acm範圍裡,我們只需了解時間複雜度可以大致地通過乙個演算法運算的次數來描述程式執行的效率,常常用大寫字母o來表示。在表示時間複雜度的時候,只保留數量級最大的一項,並忽略係數。對於給定的常數n 若某乙個演算法...
演算法的特性及時空複雜度
有限性 完成步驟有限,不能形成無窮迴圈 確定性 演算法的每一步驟都必須有確定含義,無二異性得以實現 輸入 有多個或0個輸入 至少有乙個或者多個輸出 可行性 原則上精確進行,操作可以通過已實現基本運算執行有限次而完成 1.不含有語法錯誤 2.對於幾組資料可以得出滿意的結果 3.程式對於精心挑選的典型。...