什麼是演算法——問題、計算模型與正確性
計算問題(computational problem)
計算問題是職務說明,不是員工本身。在談論演算法之前,你必須先精確說出什麼才算正確答案。「把這些數字排序」是一個問題;「把薪資加總」是一個問題;「找出最短行車路線」是一個問題。問題說的是輸出必須與輸入維持什麼關係——它不說怎麼算出來。那個「怎麼算」是演算法的職責。
形式上,一個計算問題由兩樣東西界定:合法輸入的集合,以及對每個輸入而言什麼樣的輸出才算正確。我們通常把它寫成輸入與可接受輸出之間的一個關係。以排序為例:輸入是可比較項目的有限序列,而一個輸出之所以正確,是因為它恰好包含相同的項目、重新排成非遞減的順序。注意這把答案釘死了,卻沒指名任何方法——合併排序、快速排序,乃至緩慢的氣泡排序,解的都是同一個問題,而且都用這同一份規格來判定是否正確。
把問題敘述寫對,仗就打了一半,而這也正是含糊會釀成真正臭蟲的地方。「找一條好路線」在你說清楚「好在哪」之前,根本還不是一個問題——距離最短、時間最快,還是轉彎最少?計算問題是演算法必須滿足的合約;合約沒精確寫下來之前,你連演算法是否正確都無從談起,更別說它有多快了。
問題「排序」:輸入=一串數字;輸出=把輸入重新排成非遞減順序的一串數字。對輸入 [3,1,2],唯一正確的輸出是 [1,2,3]。
問題決定什麼是正確;許多不同演算法都能產生它。
別把問題和它的某個實例混為一談。「排序」是問題;「排序 [3,1,2]」是它的單一實例。演算法必須對所有合法輸入都有效,而不只是某一個。
又稱
另見