1、基礎定義算法
算法定義:數據結構
算法是解決特定問題求解步驟的描述,在計算機中表現爲指令的有限序列,而且每條指令表示一個或多個操做,每個操做都有特定的功能函數
算法的基本特色:測試
(1)輸入輸出:算法具備0個或多個輸入,至少有一個或多個輸出;spa
(2)有窮性:指算法在執行有限的步驟以後,自動結束而不會出現無限循環,而且每個步驟在可接受的時間內完成;設計
(3)肯定性:算法的每一步驟都具備肯定的含義,不會出現二義性。code
(4)可行性:算法的每一步都必須是可行的,也就是說,每一步都可以經過執行有限次數完成;blog
算法設計要求:排序
(1)正確性:算法的正確性是指算法至少應該具備輸入、輸出和加工處理無歧義性、能正確反映問題的需求、可以獲得問題的正確答案;內存
(2)可讀性:算法設計的另外一目的是爲了便於閱讀、理解和交流
(3)健壯性:當輸入數據不合法時,算法也能作出相關處理,而不是產生異常或莫名其妙的結果;
(4)時間效率高存儲量低:時間效率指的是算法的執行時間,對於同一個問題,若是有多個算法可以解決,執行時間短的算法效率高,執行時間長的效率低。存儲量需求指的是算法在執行過程當中須要的最大存儲空間,主要指算法程序運行時所佔用的內存或外部硬盤存儲空間。設計算法應該儘可能知足時間效率高和存儲量低的需求。
2、算法效率檢測
時間複雜度:
在進行算法分析時,語句總的執行次數 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)。
3、總結