CHAPTER ONE
1.1 演算法
解決的問題:什麼是演算法.
舉例:
演算法E(歐幾裡得演算法):給定兩個正整數m和n,求他們的最大公因子.
E 1. (求餘數)以n除m並令r為所得餘數(0≤r<n).
E 2. (餘數為0?)若r=0 演算法結束;n即為答案.
E 3. (互換)令m←n, n←r,並返回步驟E1
框圖如下:
演算法的五個特性:
1) 有窮性 一個演算法必須總是在執行有窮步之後結束.演算法E是滿足該條件的.因為在步驟E1之後,r<n,所以如果r≠0,下一次執行步驟E1時,n的值已經減小,正整數的遞降序列一定會終止,因此對於任意的m和n,演算法E肯定會在有窮次後結束.
2) 確定性 演算法的每一個步驟必須是確切定義的
3) 輸入 一個演算法必須有0個或多個輸入(E中有兩個輸入m和n)
4) 輸出 一個演算法必須有一個或多個輸出(E中最終輸出的n)
5) 可行性 一般來說,還期望一個演算法是可行的.
演算法的5個特性中,有窮性顯然是不夠的,因為一個演算法不光要可以執行,而且要高效.
演算法的數學定義:
藉助數學的集合論思想,我們可以定義演算法如下:一個計算方法是一個四字式(Q,I,Ω,f),其中q是一個包含I和Ω的集合,f是由Q到它自身的一個函數. f應當保留Ω的每個元素不動(me:注意Ω是輸出集合.),也就是說,對於Ω中的所有元素q 必有f(q)=q. 這四個量Q,I, Ω,f 分別用來表示計算的狀態,輸入,輸出和計算的規則. 集合I中的每個輸入定義一個計算序列x0, x1, x2... 如下:
x0 = x 且 xk+1 = f(xk) 對於任意的 k≥0 (1)
如果有k是使得xk在Ω中的最小整數(此處的最小是k最小,而不是xk),則稱計算序列在第k步終止. 這種情況下也說:x產生輸出xk(注意,如果xk在Ω中,則xk+1也是,因為在這樣的情況下, xk+1=xk(me:對於輸出集合歐姆f將其中的任意元素q映射到自身q,即f(q)=q)).某些計算序列可能永不終止,而一個演算法是對於I中的所有元素x,都在有窮多的步驟內終止的一個計算方法.
(me:一個演算法是一個有窮的計算方法.而一個計算方法是一(Q,I,Ω,f)的四元組)
例子:演算法E,設Q為所有的單個數 (n) 所有的有序偶 (m,n) 和所有有序的四字式(四元組)(m,n,r,1),(m,n,r,2)以及(m,n,p,3)的集合,其中m,n和p為正整數,而r是一個非負整數.設I是所有有序偶(m,n)做成的子集,並設Ω是所有單個的數(n)的子集.設f定義如下:
f(m,n) = (m,n,0,1); f(n) = n;
f(m,n,r,1) = (m,n,m%n,2);
f(m,n,r,2) = (n) 如果r=0, 否則(m,n,r,3).
f(m,n,p,3) = (n,p,p,1)
這個更數學的方式表達的意思跟 演算法E 的各個步驟之間的對應關係式顯然的.