一、計算模型
1.1 定義:
我們在思考和處理算法的時候是機器無關、實現語言無關的。所有的算法運行在一種“抽象的機器”之上,這就是計算模型。
1.2 種類
圖靈機是最有名的計算模型,本課使用更簡單更合適的RAM計算模型。
1.3 RAM(Random Access Machine)模型
RAM模型的基本構成如下:
RAM計算模型有如下特點:
- 一個簡單操作花費一步:鍵值比較、加減、內存訪問
- 沒有操作可以被分解:循環、子程序
- 內存:訪存是一個簡單操作、無限制的內存
二、算法設計
2.1 算法問題規約
將算法問題嚴格的定義為精確限定輸入\輸出的“規約”形式:
- 輸入:明確定義了算法接受的所有合法輸入
- 輸出:明確定義了對於每一個合法的輸入值,相應的輸出值應該是什么
例子1:
Euclid算法,輾轉相除法的算法實現,計算m、n的最大公約數
輸入:非負整數m,n
輸出:gcd(m,n)

int Euclid(int m, int n) { if (m <= n) swap(m,n); while (m%n != 0) { n = m%n; m = n; } return n; } //這是測試用例 int main() { cout << Euclid(15,12) << endl; system("pause"); return 0; }
例子2:
順序搜索,在一個數組中搜尋一個具體的數
輸入:關鍵字K,數組E[1...n]
輸出:如果K在E中,返回K在E中的位置,如果不在則返回-1

int SequentialSearch(vector<int> e, int k) { for (int i = 0; i < e.size(); ++i) if (k == e[i]) return i; return -1; } //這是測試用例 int main() { vector<int> e = {1,2,3,4,5,6}; cout << SequentialSearch(e,8) << endl; system("pause"); return 0; }
2.2 算法正確性的證明:數學歸納法
EUCLID算法正確性的證明:
當n=0時,對於任何m,有Euclid(m,0)=0
假設當n<=N時成立,考慮n=N+1的情況:
先有Euclid(m, N+1) = Euclid(N+1, m mod (N+1) ) ,而m mod(N+1)<=N恆成立,根據假設可知Euclid(N+1, m mod (N+1) )總能得出正確的答案,即n=N+1得證。
三、算法分析
3.1 算法的性能指標
- 時間復雜度
- 空間復雜度
在RAM中,時間復雜度使用RAM中執行簡單操作的個數衡量,空間復雜度使用RAM中寄存器的個數來衡量。這樣,對算法的性能分析變成了一個計數問題。由於RAM是抽象的,所以我們的衡量指標也是機器無關、語言無關的。
3.2 最壞情況復雜度
最壞復雜度的含義是最壞的輸入對於的復雜度
例子:
在順序搜索之中,待搜索的數k在數組e的位置越靠后,所需要搜尋的次數也就越多,當k在e的最后一個,此時為最壞情況。
3.3 平均情況復雜度
僅僅靠最壞情況時間復雜度不能充分代表算法性能。可以采用平均情況下的復雜度。
- 明確算法所有輸入的分布情況
- 計算期望
例子:
對於順序搜索的問題,給定數組為E[],長度為n,搜尋目標為K,假設所有輸入情況等概率的出現。則成功的平均概率應該如下: