什麼是演算法——問題、計算模型與正確性

問題實例(problem instance)

實例是一個具體的問句,而問題是整族問句。如果問題是「把兩個數相乘」,那麼「把 23 乘以 47」就是它的一個實例。問題是帶空格的模板;實例是把空格填上具體資料的模板。你把一個實例餵給演算法,得到的是那個實例的答案。

精確地說,問題界定了所有合法輸入的集合,而每一個特定的合法輸入就是一個實例。對排序問題而言,數列 [3,1,2] 是一個實例,數列 [9,9,9] 是另一個實例,空數列又是一個。每個實例有自己的正確答案([3,1,2] 的答案是 [1,2,3]),但它們全都受同一份「排序」定義所規範。一個演算法唯有在每個實例上都回傳正確答案,才算解出該問題,這包括空數列或已排序數列這類古怪或極端的例子。

這個區別在分析裡無處不在。當我們談演算法要花多久時間,指的是它在某個給定大小的實例上要花多久——而關鍵在於,同樣大小的不同實例可能花不同時間(這正是最壞、最好與平均情況所要捕捉的)。當有人說「這個演算法是 O(n log n)」,他談的是整族實例,而非某個走運的例子。

問題:路網中的最短路徑。一個實例:「在今天的地圖上,從圖書館到車站的最短路線。」改變起點、終點或地圖,你就得到同一問題的不同實例。

一個問題,無窮多個實例;演算法必須全部都能處理。

用幾個實例測試演算法能找出臭蟲,卻永遠無法證明正確性——實例通常有無窮多個。通過幾個例子能增強信心;唯有證明才能保證全部都對。

又称
instanceinput case實例輸入個例