演算法——計算的靈魂(《演算法》一本寫了近40年的書)

丁曉昀發表於2012-06-04

計算機語言從BASIC到C/C++、Java,再到後來的PHP、Ruby等,你方唱罷我登場,讓人眼花繚亂。而演算法確是電腦科學的核心,萬變不離其宗!

演算法能為我們節約非常多的資源,甚至能夠完成一些不可能完成的任務。在某些需要處理上百萬個物件的應用程式中,設計優良演算法甚至可以將程式執行的速度提高一百萬倍。與此相反,花費金錢和時間去購置新的硬體可能只能將速度提高十倍或是百倍。無論在任何應用領域,精心設計的演算法都是解決大型問題最有效的方法。學習演算法是非常有趣和令人激動的,因為這是一個歷久彌新的領域。20世紀60年代和70年代的研究者用這些演算法為我們的今天打下了基礎。他們知道,可擴充套件的演算法是未來的關鍵,而過去幾十年演算法發展也證明了這一點。現在,基礎設施已經完備,人們已經開始利用它們達到各種目的。

21世紀的今天,日益先進的儲存手段使資訊量呈指數級增長,如何快速處理它們,如何更好地利用它們,這些挑戰都需要設計精巧的演算法來解決。正如B.Chazelle所說,20世紀是方程的世紀,但21世紀是演算法的世紀。本書的重點是學習重要而實用的演算法。書中既有精巧、複雜和困難的演算法,也有優雅、樸素和簡單的演算法。在科學和商業應用中,我們的目標是理解前者並熟悉後者,只有這樣才能掌握這些有用的工具並學會“演算法式思考”以迎接未來的計算性挑戰。

本書的作者之一Robert Sedgewick是普林斯頓大學的電腦科學教授。他在Adobe Systems公司擔任總監職位,並曾在施樂的帕洛阿爾託研究中心(Xerox PARC)、美國國防部防禦分析研究所(the lnsititute for Defense Analyses)和法國國立計算機與自動化研究所(INRIA)從事研究工作,他從史丹佛大學獲得了博士學位,是演算法宗師Donald E.Knuth的門下高徒。本書另一位作者Kevin Wayne 是康奈爾大學博士,普林斯頓大學電腦科學系高階講師,研究方向包括演算法的設計、分析和實現,特別是圖和離散優化。

enter image description here

本書前言

本書力圖研究當今最重要的計算機演算法並將一些最基礎的技能傳授給廣大求知者。它適合用作電腦科學進階教材,面向已經熟悉了計算機系統並掌握了基本程式設計技能的學生。本書也可用於自學,或是作為開發人員的參考手冊,因為書中實現了許多實用演算法並詳盡分析了它們的效能特點和用途。這本書取材廣泛,很適合作為該領域的入門教材。

演算法和資料結構的學習是所有電腦科學教學計劃的基礎,但它並不只是對程式設計師和計算機系的學生有用。任何計算機使用者都希望計算機能執行得更快一些或是能解決更大規模的問題。本書中的演算法代表了近50年來的大量優秀研究成果,是人們工作中必備的知識。從物理中的N體模擬問題到分子生物學中的基因序列問題,我們描述的基本方法對科學研究而言已經必不可少;從建築建模系統到模擬飛行器,這些演算法已經成為工程領域極其重要的工具;從資料庫系統到網際網路搜尋引擎,演算法已成為現代軟體系統中不可或缺的一部分。這僅是幾個例子而已,隨著計算機應用領域的不斷擴張,這些基礎方法的影響也會不斷擴大。

在開始學習這些基礎演算法之前,我們先要熟悉全書中都將會用到的棧、佇列等低階抽象的資料型別。然後我們依次研究排序、搜尋、圖和字串方面的基礎演算法。最後一章將會從巨集觀角度總結全書的內容。 獨特之處本書致力於研究有實用價值的演算法。書中講解了多種演算法和資料結構,並提供了大量相關的資訊,讀者應該能有信心在各種計算環境下實現、除錯並應用它們。本書的特點涉及以下幾個方面。

演算法 書中均有演算法的完整實現,並討論了程式在多個樣例上的執行狀況。書中的程式碼都是可以執行的程式而非虛擬碼,因此非常便於投入使用。書中程式是用Java語言編寫的,但其程式設計風格方便讀者使用其他現代程式語言重用其中的大部分程式碼來實現相同演算法。

資料型別 我們在資料抽象上採用了現代程式設計風格,將資料結構和演算法封裝在了一起。

應用 每一章都會給出所述演算法起到關鍵作用的應用場景。這些場景多種多樣,包括物理模擬與分子生物學、計算機與系統工程學,以及我們熟悉的資料壓縮和網路搜尋等。

學術性 我們非常重視使用數學模型來描述演算法的效能。我們用模型預測演算法的效能,然後在真實的環境中執行程式來驗證預測。

廣度 本書討論了基本的抽象資料型別、排序演算法、搜尋演算法、圖及字串處理。我們在演算法的討論中研究資料結構、演算法設計正規化、歸納法和解題模型。這將涵蓋20世紀60年代以來的經典方法以及近年來產生的新方法。

我們的主要目標是將今天最重要的實用演算法介紹給儘可能廣泛的群體。這些演算法一般都十分巧妙奇特,20行左右的程式碼就足以表達。它們展現出的問題解決能力令人歎為觀止。沒有它們,創造計算智慧、解決科學問題、開發商業軟體都是不可能的。

本書網站

本書的一個亮點是它的配套網站algs4.cs.princeton.edu。這一網站面向的是老師、學生和專業人士,包含了關於演算法和資料結構的豐富資料,均可免費獲得。

一份線上大綱 包含了本書內容的結構並提供了連結,瀏覽起來十分方便。

全部實現程式碼 書中所有的程式碼均可以在這裡找到,且其形式適合用於程式開發。此外,還包括演算法的其他實現,例如高階的實現、書中提及的改進的實現、部分習題的答案以及多個應用場景的客戶端程式碼。我們的重點是用真實的應用環境來測試演算法。

習題與答案 網站還提供了一些附加的選擇題(只需要一次單擊便可獲取答案)、很多演算法應用的例子、程式設計練習和答案以及一些有挑戰性的難題。

動態視覺化 書是死的,但網站是活的,在這裡我們充分利用圖形類演示了演算法的應用效果。

課程資料 網站包含和本書及網上內容對應的一整套幻燈片,以及一系列程式設計作業、核對表、測試資料和備課手冊。

相關資料連結 網站包含大量的連結,提供演算法應用的更多背景知識以及學習演算法的其他資源。

我們希望這個站點和本書互為補充。一般來說,建議讀者在第一次學習某種演算法或是希望獲得整體概念時看書,並把網站作為程式設計時的參考或是線上查詢更多資訊的起點。

作為教材

本書為電腦科學專業進階的教材。它涵蓋了這門學科的核心內容,並能讓學生充分鍛鍊程式設計、定量推理和解決問題等方面的能力。一般來說,此前學過一門計算機方面的先導課程就足矣,只要熟悉一門現代程式語言並熟知現代計算機系統,就都能夠閱讀本書。

雖然本書使用Java實現演算法和資料結構,但其程式碼風格使得熟悉其他現代程式語言的人也能看懂。我們充分利用了Java的抽象性(包括泛型),但不會依賴這門語言的獨門特性。

書中涉及的多數數學知識都有完整的講解(少數會有延伸閱讀),因此閱讀本書並不需要準備太多數學知識,不過有一定的數學基礎當然更好。應用場景都來自其他學科的基礎內容,同樣也在書中有完整介紹。 本書涉及的內容是任何準備主修電腦科學、電氣工程、運籌學等專業的學生應瞭解的基礎知識,並且對所有對科學、數學或工程學感興趣的學生也十分有價值。

背景介紹

這本書意在接續我們的一本基礎教材《Java程式設計:一種跨學科的方法》,那本書對計算機領域做了概括性介紹。這兩本書合起來可用作兩到三個學期的電腦科學入門課程教材,為所有學生在自然科學、工程學或社會科學中解決計算問題提供必備的基礎知識。

本書大部分內容來自Sedgewick的演算法系列書籍。本質上,本書和該系列的第1版和第2版最接近,但還包含了作者多年教學和學習的經驗。Sedgewick的《C演算法(第3版)》、《C++演算法(第3版)》、《Java演算法(第3版)》更適合用作參考書或是高階課程的教材,而本書則是專門為大學一、二年級學生設計的一學期教材,也是最新的基礎入門書或從業者的參考書。

相關文章