大話數據結構學習筆記 - 算法
定義
算法(Algorithm): 解決特定問題求解步驟的描述,在計算機中表現爲指令的有限序列,並且每條指令表示一個或多個操作
算法的特性
- 輸入輸出:算法具有零個或多個輸入,至少有一個或多個輸出
- 有窮性: 指算法在執行有限的步驟之後,自動結束而不會出現無限循環,並且每一個步驟在可接受的時間內完成。
- 確定性: 算法的每一步驟都具有確定的含義,不會出現二義性
- 可行性: 算法的每一步都必須是可行的,即每一步都能夠通過執行有限次數完成
算法設計的要求
- 正確性: 算法的正確性是指算法至少應該具有輸入、輸出和加工處理無歧義性、能正確反映問題的需求、能夠得到問題的正確答案。
- 可讀性: 算法設計的另一目的是爲了便於閱讀、理解和交流
- 健壯性: 當輸入數據不合法時,算法也能做出相關處理,而不是產生異常或莫名其妙的結果
- 時間效率高和存儲量低:即執行時間和存儲空間
算法效率的度量方法
事前分析估算方法
在計算機程序編制前,依據統計方法對算法進行估算。一個程序的運行時間,依賴於算法的好壞和問題的輸入規模即輸入量的多少
求和算法
1
int i, sum = 0, n = 100; // 執行 1 次 for(i = 1; i <= n; i++) // 執行了 n+1 次 sum = sum + i; // 執行 n 次 printf("%d", sum); // 執行 1 次
求和算法
2
int sum = 0, n = 100; // 執行一次 sum = (1 + n) * n / 2; // 執行一次 printf("%d", sum); // 執行一次
對上述連個算法,忽略頭尾循環判斷的開銷,就是n
次與1
次的差距, 算法好壞顯而易見
算法時間複雜度
在進行算法分析時,語句總的執行次數
T(n)
是關於問題規模n
的函數, 進而分析T(n)
隨n
的變化情況並確定T(n)
的數量級。 算法的時間複雜度,也就是算法的時間量度,記作;T(n) = O(f(n))
。 它表示隨問題規模n
的增大,算法執行時間的增長率和f(n)
的增長率相同,稱作算法的漸進時間複雜度,簡稱爲時間複雜度。其中f(n)
是問題規模n
的某個函數
推導大O
階方法
- 用常數
1
取代運行時間中的所有加法常數 - 在修改後的運行次數函數中,只保留最高階項
- 如果最高階項存在且不是
1
, 則去除與這個項相乘的常數
得到的結果就是大O
階
常數階
求和算法2
中,運行次數函數爲O(3)
,根據推導大O
階方法,得到時間複雜度爲O(1)
線性階
求和算法1
中,算法的時間複雜度爲O(n)
對數階
int count = 1;
while(count < n)
count = count * 2;
由
平方階
int i, j;
for(i = 0; i < m; i++)
for(j = 0; j < n; j++)
{
/* 時間複雜度爲 O(1) 的程序步驟序列 */
}
循環嵌套, 故時間複雜度爲
m=n
, 則時間複雜度爲常見的時間複雜度
從
n
都會使的結果變得不顯示
最壞情況與平均情況
最壞情況運行時間是一種保證,那就是運行時間將不會再壞了。一般提到的運行時間都是最壞情況的運行時間。平均運行時間是所有情況中最有意義的,因爲它是期望的運行時間
算法空間複雜度
算法的空間複雜度通過計算算法所需的存儲空間實現,算法空間複雜度的計算公式記作:
, 其中n
爲問題的規模,f(n)
爲語句關於n
所佔存儲空間的函數
結語
算法的基本概念,比如其定義、特性、設計要求、度量方法等。還有推導大O
階,以及常見的時間複雜度以及關於算法最壞情況的概念