一、基礎定義
算法定義:
算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個操作,每一個操作都有特定的功能
算法的基本特點:
(1)輸入輸出:算法具有0個或多個輸入,至少有一個或多個輸出;
(2)有窮性:指算法在執行有限的步驟之后,自動結束而不會出現無限循環,並且每一個步驟在可接受的時間內完成;
(3)確定性:算法的每一步驟都具有確定的含義,不會出現二義性。
(4)可行性:算法的每一步都必須是可行的,也就是說,每一步都能夠通過執行有限次數完成;
算法設計要求:
(1)正確性:算法的正確性是指算法至少應該具有輸入、輸出和加工處理無歧義性、能正確反映問題的需求、能夠得到問題的正確答案;
(2)可讀性:算法設計的另一目的是為了便於閱讀、理解和交流
(3)健壯性:當輸入數據不合法時,算法也能做出相關處理,而不是產生異常或莫名其妙的結果;
(4)時間效率高存儲量低:時間效率指的是算法的執行時間,對於同一個問題,如果有多個算法能夠解決,執行時間短的算法效率高,執行時間長的效率低。存儲量需求指的是算法在執行過程中需要的最大存儲空間,主要指算法程序運行時所占用的內存或外部硬盤存儲空間。設計算法應該盡量滿足時間效率高和存儲量低的需求。
二、算法效率檢測
時間復雜度:
在進行算法分析時,語句總的執行次數 T(n)是關於問題規模 n的函數,進而分析 T(n)隨 n 的變化情況並確定 T(n)的數量級。算法的時間復雜度,也就是算法的時間量度,記作:T(n)=O(f(n))。它表示隨問題規模 n 的增大,算法執行時間的增長率和f(n)的增長率相同,稱作算法的漸近時間復雜度,簡稱為時間復雜度。其中 f(n)是問題規模 n 的某個函數。
1.用常數 1 取代運行時間中的所有加法常數。 2.在修改后的運行次數函數中,只保留最高階項。 3.如果最高階項存在且不是 1,則去除與這個項相乘的常數。得到的結果就是大 O 階。
int sum = 0,n = 100; /*執行一次*/
sum = (1+n)*n/2; /*執行一次*/
printf("%d", sum); /* 執行一次*/
for(int i=0; i<n ;i++){
print(""+i);
}
int count = 1;
while (count < n){
count = count * 2; /*時間復雜度為 O(1)的程序步驟序列*/
}
for(int i=0; i<n ;i++){
for(int j=0; j<n ;j++){
print(""+i+j);
}
}
int i,j;
for(i = 0; i < n; i++){
for (j = i; j < n; j++) /*注意 int j = i 而不是 0*/
{
print("結果"+i+j);
}
}
O(1)<O(log n)<O(n)<O(n*logn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n);
空間復雜度
算法的空間復雜度通過計算算法所需的存儲空間實現,算法空間復雜度的計算公式記作:S(n)= O(f(n)),其中,n為問題的規模,f(n)為語句關於n所占存儲空間的函數。一般情況下,一個程序在機器上執行時,除了需要存儲程序本身的指令、常數、變量和輸入數據外,還需要存儲對數據操作的存儲單元,若輸入數據所占空間只取決於問題本身,和算法無關,這樣只需要分析該算法在實現時所需的輔助單元即可。若算法執行時所需的輔助空間相對於輸入數據量而言是個常數,則稱此算法為原地工作,空間復雜度為0(1)。
三、總結
