完成任務的步驟 - 淺談演算法
演算法(Algorithm)一詞,源自於西元九世紀的波斯天文學、地理學和數學家「花拉子米(al-Khwārizmī)」。他創造了許多基礎的數學計算方法和技術,也被譽為「代數之父」。而「花拉子米」的拉丁文音譯則為「演算法」。
根據《韋氏大字典》(Merriam Webster Collegiate Dictionary)的定義,演算法(Algorithm)是「解決問題或完成目標的逐步程序(a step-by-step procedure for solving a problem or accomplishing some end)」。簡單來說,演算法就是完成任務的步驟,而這些步驟,必須具有清楚的定義與順序。在日常生活中,從簡單的開燈關燈,到複雜的無人駕駛,都可以透過演算法來完成。
舉例來說,「房間裡太暗了,有什麼方法得到亮光?」解決方法的步驟可能如下:
第一種:A.走到門邊;B.找到牆上電燈的開關;C.按下它;D.得到您要的光源。
第二種:A.摸黑走到窗檯旁邊;B.找到窗簾的繫繩;C.向下拉動;D.得到您要的光源。
現在,您可以說,以上兩種方法的四個步驟就是「得到亮光」的演算法。
將演算法應用到電腦上,就是透過一連串的指令,讓電腦做事情。以資工系的程式設計課為例,許多老師會要求學生,繳交一個井字遊戲(Tic-Tac-Toe)的必勝(至少是平手)演算法,並透過此演算法,撰寫出背後的程式碼。
從演算法的定義中可發現,為了解決問題或完成目標,演算法需要預先設想所有可能的細節,並為各種可能發生的狀況,找到對應的方法。
以井字遊戲來說,假設對手先畫X,共有9種可能的位置。當對手選擇在正中間畫下X時,我們則可在其他八個位置畫O,以此類推。這樣的概念,很適合透過樹狀圖的方式來呈現,如圖1所示。
透過樹狀圖的展開,我們可以發現,樹狀圖的最下層會呈現各種遊戲的結果(贏-平-輸)。接著我們即可藉由各種可能發生的狀況(樹狀圖中的路徑),找到對應的方法(必勝法則)。
一般來說,演算法有五大特性:
1.輸入:由外界所提供的單一或多項資料的輸入。例如將電燈開關按到「開」的位置,例如在井字遊戲中,畫上O或X。
2.輸出:一個演算法應有一個或一個以上的結果輸出,而輸出的量是演算法計算的結果。例如電燈泡發出亮光;例如井字遊戲中的三種結果贏─平─輸。
3.明確性:每一項指令及步驟必須清楚且明確,以免混淆不清。例如:「天色暗了,就要開燈」是很不明確的敘述。什麼情況叫天色暗?每個人對暗的定義都不一樣,所以這個指令沒有明確性。如果改成 「每天晚上六點半以後,就要開燈。」,這樣敘述就非常明確了。
4.有限性:必須在有限個步驟內完成任務。換言之,每個演算法必須在有限的步驟裡完成或終止,不能無限期執行。亦即為了避免形成無窮迴路,必須在有限步驟內解決,以方便追蹤及評估。
5.有效性:又稱可行性,演算法中描述的操作,都可藉由已實現的基本運算,執行有限次數來實現。做不到的方法,做再多次也沒有用。
作者:蘇宇暉(台科大管研所博士候選人)、羅凱揚(台科大企管系博士)
繪圖者:謝瑜倩