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