前言
一個人在接受科技教育時能得到的最珍貴的收獲是能夠終身受用的通用智能工具。
——喬治·福賽思
無論是計算科學還是計算實踐,算法都在其中扮演著重要角色。因此,這門學科中出現了大量的教材。它們在介紹算法的時候,基本上都選擇了以下兩種方案中的一種。第一種方案是按照問題的類型對算法進行分類。這類教材安排了不同的章節分別討論排序、查找、圖等算法。這種做法的優點是,對于解決同一問題的不同算法,它能夠立即比較這些算法的效率。其缺點在于,由于過于強調問題的類型,它忽略了對算法設計技術的討論。
第二種方案圍繞著算法設計技術來組織章節。在這種結構中,即使算法來自于不同的計算領域,如果它們采用了相同的設計技術,就會被編成一組。從各方(例如[BaY95])獲得的信心使我相信,這種結構更適合于算法設計與分析的基礎課程。強調算法設計技術有三個主要原因。第一,學生們在解決新問題時,可以運用這些技術設計出新的算法。從實用的角度看,這使得學習算法設計技術頗有價值。第二,學生們會試圖按照算法的內在設計方法對已知的眾多算法進行分類。計算機科學教育的一個主要目的,就是讓學生們知道如何發掘不同應用領域的算法間的共性。畢竟,每門學科都會傾向于把它的重要主題歸納為幾個甚至一個規則。第三,依我看來,算法設計技術作為問題求解的一般性策略,在解決計算機領域以外的問題時,也能發揮相當大的作用。
遺憾的是,無論是從理論還是從教學的角度,傳統的算法設計技術分類法都存在一些嚴重的缺陷。其中最顯著的缺陷就是無法對許多重要的算法進行分類。由于這種局限性,這些書的作者不得不在按照設計技術進行分類的同時,另外增加一些章節來討論特殊的問題類型。但這種改變導致課程缺乏一致性,而且很可能會使學生感到迷惑。