本書采用程序員最愛用的面向對象C++語言來描述數據結構和算法,并把數據結構原理和算法分析技術有機地結合在一起,系統(tǒng)介紹了各種類型的數據結構和排序、檢索的各種方法。作者非常注意對每一種數據結構不同存儲方法及有關算法進行分析比較。書中還引入了一些比較高級的數據結構與先進的算法分析技術,并介紹了可計算性理論的一般知識。本版的重要改進在于引入了參數化的模板,從而提高了算法中數據類型的通用性,支持高效的代碼重用。本書概念清楚、邏輯性強、內容新穎,可作為大專院校計算機軟件專業(yè)與計算機應用專業(yè)學生的教材和參考書,也可供計算機工程技術人員參考。譯者序數據結構與算法分析是一門計算機專業(yè)十分重要的基礎課,計算機科學各領域及各種應用軟件都要使用相關的數據結構和算法。當面臨一個新的設計問題時,設計者需要選擇適當的數據結構,并設計出滿足一定?奔浜涂占湎拗頻撓行惴?。本书作者把数据结官復算法分析又x厝嗪顯諞槐窘灘鬧?,有助釉溋者根据问题的袨氖选择簜b淼氖萁峁梗⒍允奔淇占涓叢有越斜匾目刂?。??本書采用當前流行的面向對象的C++語言來描述數據結構和算法,因為C++語言是程序員最廣泛使用的語言。因此,程序員可以把本書中的許多?惴ㄖ苯佑τ糜誚吹氖導氏钅恐?。尽??數據結構和算法在設計本質上還是很底層的東西,并不像軟件工程大型項目設計那樣,對面向對象方法具有直接的依賴性,因此有人會認為并不需要采用面向對象的高級技術來描述底層的算法,但是采用C++語言能夠更好地體現抽象數據類型的概念,從而更本質地描述數據結構和算法。為了使本書清晰易懂,作者有意回避了C++的某些重要特性。這個版本的重要改進是引入了參數化的模板,從而提高了算法中數據類型的通用性,支持高效的代碼重用。本書包括四大部分內容,第一部分是準備工作,介紹了一些基本概念和術語,以及基本的數學知識。第二部分介紹了最基本的數據結構,依次為線性表(包括棧和隊列)、二叉樹和樹。對每種數據結構的講解都從其數學特性入手,先介紹抽象數據類型,然后再討論不同的存儲方法,并且研究不同存儲方法的可能算法。值得贊賞的是,作者結合算法分析來討論各種存儲方法和算法的利弊,摒棄那些不適宜的方法,這樣就調動了讀者思維,使其可從中學到考慮問題的方法。這種“授人以漁”的策略使讀者在今后設計和應用數據結構時能夠全面地考慮各種因素,并選擇最佳方案。作為最常用的算法,排序和檢索歷來是數據結構討論的重點問題。這在第三部分的第9章和第10章中進行了詳盡的討論。排序算法最能體現算法分析的魅力,它的算法速度要求非常高:其中內排序主要考慮的是怎樣減少關鍵碼之間的比較次數和記錄交換次數,以提高排序速度;而外排序則考慮外存的特性,盡量減少訪問操作,以提高排序速度。第8章證明了所有基于比較的排序算法的時間代價是Θ(nlogn),這也是排序問題的時間代價。檢索則考慮怎樣提高檢索速度,這往往與存儲方法有關。書中介紹了幾種高效的數據結構,如自組織線性表、散列表、B樹和B+樹等,都具有極好的檢索性能。第四部分介紹了數據結構的應用與一些高級主題,其中包括圖、跳躍表、廣義表和稀疏矩陣等更復雜的線性表結構、還包括Trie結構、AVL樹等復雜樹結構,以及kd樹、PR四分樹等空間數據結構。另外,第四部分還簡單介紹了求和、遞歸關系分析和均攤分析等高級算法分析技術,這些技術對于提高程序員的算法分析能力具有重要作用。本書的前言及第1章至第7章由張銘翻譯,第8章至第15章由劉曉丹翻譯。另外,肖毅、柴雯、肖之屏、劉NFB35、趙培翔、李麗、王蜀安、張海東、劉振飛和李健等人也參加了本書的翻譯工作,在此對他們的辛勤勞動表示感謝。由于水平有限,難免有不妥之處,歡迎批評指正。前言我們研究數據結構的目的是為了學會編寫更高效的程序。既然現在的計算機速度一年比一年快,為什么還會需要高效率的程序呢?這是由于人類解決問題的雄心與能力是同步增長的。現代計算技術在計算能力和存儲容量上的革命,僅僅提供了計算更復雜問題的有效工具,而程序的高效性要求永遠也不會過時。程序高效性的要求不會,也不應該與合理的設計和簡明清晰的編碼相矛盾。高效程序的設計基于良好的信息組織和優(yōu)秀的算法,而不是基于“編程小伎倆”。如果一個程序員沒有掌握程序設計簡明清晰的基本原理,就不可能編寫出有效的程序。反過來講,簡潔的程序需要合理的數據組織和清晰的算法。大多數計算機科學系的課程設置都已意識到,要培養(yǎng)良好的程序設計技能,首先應該強調基本的軟件工程原理。因此,一旦程序員學會了程序設計和實現簡明清晰的原理,下一步就應該學習有效的數據組織和算法,以提高程序的效率。途徑本書描述了許多用于表示數據的技術。這些技術體現在以下的原則中:1.〖ZK(#〗每一種數據結構和每一個算法都有其時間、空間的代價和效率。當面臨一個新的設計問題時,設計者要透徹地掌握權衡時間、空間代價和算法有效性的方法,以適應問題的需要。這就要懂得算法分析的原理,而且還需要了解所使用的物理介質的特性(例如,數據存儲在磁盤上與存儲在主存中時,就有不同的考慮)。2.與代價和效率有關的是時空權衡。例如,人們通常增加空間代價來減少運行時間,反之亦然。程序員所面對的時空權衡問題普遍存在于軟件設計和實現的各個階段,因此必須把這個概念牢記在心。3.程序員應該充分了解一些現成的方法,以免進行不必要的重復開發(fā)工作。因此,學生們需要了解經常使用的數據結構和相關算法。4.數據結構服從于應用需求。學生們必須把分析應用需求放在第一位,然后再尋找一種與實際應用相匹配的數據結構。要做到這一點,需要應用上述三條原則?!糧K)〗教學建議數據結構和算法設計的書籍往往囿于下面兩種情形之一〖BFQ〗:〖BF〗一種是教材,一種是百科全書。有些書籍試圖融合這兩種編排,但通常是二者都沒有組織好,而本書是作為教材來編寫的。我相信了解那些用于選擇或設計可解決問題的數據結構的基本原理十分重要,會比死記硬背書本內容重要得多。因此,本書中涵蓋了大多數(但不是所有的)標準數據結構。為了闡述一些重要原理,也包括了某些并非廣泛使用的數據結構。?磽?,本蕶┲x菇檣芰?一些相對較新但即將得到廣泛應用的數據結構。本書可作為本科生一個學期的教學內容,也可作為專業(yè)技術人員的自學教材。讀者應該具備編程經驗,最好學過相當于兩個學期的結構化程序設計語言(如Pascal或C語言),并且最好懂得一些C++的基本知識。早已熟悉遞歸的讀者具有一定的?攀?。先修完一门??的離散數學課程對于數據結構的學習也大有裨益。第2章中給出了一些理解本書所必備的數學預備知識。讀者遇到不熟悉的數學問題時,可以查閱這一章中的相關內容。盡管本書應該一個學期完成,但書中超過了一個學期的內容,這樣就可以為教師提供一些選擇的余地。二年級學生的基本數據結構和算法分析背景不太多,可以給他們詳細地講解第1~12章的內容,再從第13章中選擇一些專題來講解,我就是這樣來給二年級學生講課的。背景知識更豐富的學生,可以先讀第1章,跳過第2章中除“深入學習導讀”之外的內容,簡要地瀏覽第3章和第4章(請著重閱讀4.1.3小節(jié)和4.2小節(jié)),然后詳細閱讀其余的章節(jié)。另外,教師可以根據程序設計實習的需要,選擇第13章中的某些專題內容。第13章是針對進行較大的程序設計練習而編寫的。我建議所有選修數據結構的學生,都應該做一些高級樹結構或其他較復雜的動態(tài)數據結構的上機實習,如第12章中的跳躍表或稀疏矩陣。所有這些數據結構都沒有二叉檢索樹難,學完第5章的學生都有能力來實現它們。本書盡量合理地安排內容順序。教師可以根據需要自由地重新組織內容。讀者掌握了第1至第6章后,以下的內容就相對獨立了。顯然,外排序依賴于內排序和磁盤文件系統(tǒng)。Kruskal最小支撐樹算法使用了6.2小節(jié)關于UNION/FIND的算法。9.2小節(jié)的自組織線性表談到了8.3小節(jié)討論的緩沖區(qū)置換技術。第14章的討論基于本書的例題。15.2小節(jié)依賴于圖論知識。一般情況下,大多數主題都只依賴于同一章中討論過的內容。關于C++本書中所有示例程序都是用C++來編寫的,但也并不想難倒那些對C++不熟悉的讀者。在努力保持C++優(yōu)點的同時,我盡量使示例程序簡明、清晰。C++在本書中只是作為闡釋數據結構的工具,而且實際上只用了C++的一個小子集。特別是書中用到了C++隱蔽實現細節(jié)的特性,如類(class)、私有成員(privateclassmember)、構造函數(constructor)、析構函數(destructor)。這些特性支持著一個關鍵的概念,即體現于抽象數據類型(abstractdatatype)中的邏輯設計與體現于數據結構中的物理實現的分離。為了使本書清晰易懂,我完全回避了C++的某些重要特性,并有意排除或盡量少用一些經驗豐富的C++程序員常用的特性,如類的層次(classhierarchy)、繼承(inheritance)和虛函數(virtualfunction)。運算符和函數的重載(overloading)也很少使用。C的原始語義比C++所提供的一些類似功能要好一些。當然,上述C++的特性在實際程序中是合理的設計基礎,但是它們只能掩蓋而并沒有加強本書中所闡述的原理。例如,類的繼承在避免重復編碼和降低程序錯誤率方面很重要,但是從教育學的標準觀點來看,類的繼承在若干類中分散了數據元素的描述,從而使得程序更難理解。因此,在本書中,當類的繼承對闡述觀點有明顯作用時才使用繼承來定義類(例如第531小節(jié))。但這并不意味著程序員都應該遵從類似的原則,避免代碼重復和減少錯誤是很重要的目標,不要把本書中的示例程序直接復制到你自己的程序中,只把它們看做是對數據結構原理的闡釋即可。我需要做出的最痛苦的選擇是:在示例代碼中是否使用模板(t