基礎與複雜度
演算法
演算法就是一份食譜:一串清晰、毫不含糊的有限步驟,把某個輸入變成你想要的答案。一份烹飪食譜拿食材換來一頓飯;地圖軟體裡的路線把兩個地址換成一步步的導航;你在學校學的直式除法把兩個數換成一個商。每一種情形裡,步驟都精確到任何人——或任何電腦——只要忠實照做,都會得到同樣的結果。這份「忠實」正是要害所在:演算法是一個想法,被寫得如此樸素直白,以至於不再需要一個聰明的人去揣摩它的意思。
要算得上演算法,一個過程通常必須是確定的(每一步都精確無誤,不能有「這裡隨便看著辦」)、有窮的(在有限步之後會停下,而不是永遠跑下去)、可執行的(每一步都是你真能動手做出來的)。它還要有明確的輸入和明確的輸出。請注意演算法與任何一份具體程式是分開的:同一個合併排序演算法,可以用 C++、Python 寫,也可以寫在紙上。程式碼只是演算法的一種表達;演算法是程式碼背後的策略。
我們為什麼要計較這個區別?因為大多數有意思的問題都有許多演算法,它們全都能給出正確答案,但隨著輸入變大,所需的時間和記憶體卻可能天差地別。選得好——並能證明你的選擇既正確又高效——正是這整門學科的核心。我們用漸近分析的工具(見大 O 記號)來分析一個演算法的執行時間和空間,正是為了能比較兩份都正確的食譜,挑出那份在輸入變大時仍能跑完的。
得名自 9 世紀數學家花拉子米(al-Khwarizmi)。演算法是策略;程式則是它在某種具體語言中的一種寫法。
又稱
另見