數(shù)據(jù)結(jié)構(gòu)與算法:Python語言實現(xiàn)
定 價:109 元
叢書名:華章教育
- 作者:[美] 邁克爾,T.,古德里奇(Michael,T.,Goodrich) ... 著,張曉 趙曉南等譯 譯
- 出版時間:2018/9/1
- ISBN:9787111606604
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP311.12
- 頁碼:492
- 紙張:膠版紙
- 版次:1
- 開本:16開
本書采用Python語言介紹數(shù)據(jù)結(jié)構(gòu)和算法,包括其設(shè)計、分析和實施。本書源代碼簡潔、明確,面向?qū)ο蟮挠^點(diǎn)貫穿始終,通過繼承大限度地提高代碼重用,同時彰顯不同抽象數(shù)據(jù)類型和算法之間的異同。
高效數(shù)據(jù)結(jié)構(gòu)的設(shè)計與分析,長期以來一直被認(rèn)為是計算領(lǐng)域的一個重要主題,同時也是計算機(jī)科學(xué)與計算機(jī)工程本科教學(xué)中的核心課程。本書介紹數(shù)據(jù)結(jié)構(gòu)和算法,包括其設(shè)計、分析和實現(xiàn),可在初級數(shù)據(jù)結(jié)構(gòu)或中級算法導(dǎo)論課程中使用。我們隨后會更詳細(xì)地討論如何在這些課程中使用本書。
為了提高軟件開發(fā)的健壯性和可重用性,我們在本書中采取一致的面向?qū)ο蟮囊暯。面向(qū)ο蠓椒ǖ囊粋主要思想是數(shù)據(jù)應(yīng)該被封裝,然后提供訪問和修改它們的方法。我們不能簡單地將數(shù)據(jù)看作字節(jié)和地址的集合,數(shù)據(jù)對象是抽象數(shù)據(jù)類型(Abstract Data Type,ADT)的實例,其中包括可在這種類型的數(shù)據(jù)對象上執(zhí)行的操作方法的集合。我們強(qiáng)調(diào)的是對于一個特定的ADT可能有幾種不同的實現(xiàn)策略,并探討這些選擇的優(yōu)點(diǎn)和缺點(diǎn)。我們幾乎為書中的所有數(shù)據(jù)結(jié)構(gòu)和算法都提供了完整的Python實現(xiàn),并介紹了將這些實現(xiàn)組織為可重用的組件所需的重要的面向?qū)ο笤O(shè)計模式。
通過閱讀本書,讀者可以:
對常見數(shù)據(jù)集合的抽象有一定了解(如棧、隊列、表、樹、圖)。
理解生成常用數(shù)據(jù)結(jié)構(gòu)的高效實現(xiàn)的算法策略。
通過理論方法和實驗方法分析算法的性能,并了解競爭策略之間的權(quán)衡。
明智地利用編程語言庫中已有的數(shù)據(jù)結(jié)構(gòu)和算法。
擁有大多數(shù)基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)和算法的具體實現(xiàn)經(jīng)驗。
應(yīng)用數(shù)據(jù)結(jié)構(gòu)和算法來解決復(fù)雜的問題。
為了達(dá)到最后一個目標(biāo),我們在書中提供了數(shù)據(jù)結(jié)構(gòu)的很多應(yīng)用實例,包括:文本處理系統(tǒng),結(jié)構(gòu)化格式(如HTML)的標(biāo)簽匹配,簡單的密碼技術(shù),文字頻率分析,自動幾何布局,霍夫曼編碼,DNA序列比對,以及搜索引擎索引。
本書特色
本書主要基于由Goodrich和Tamassia所著的《Data Structures and Algorithms in Java》,以及由Goodrich、Tamassia和Mount所著的《Data Structures and Algorithms in C++》編寫而成。然而,我們并不是簡單地用Python語言實現(xiàn)以上書籍的內(nèi)容。為了充實內(nèi)容,我們重新設(shè)計了本書:
對全部代碼進(jìn)行了重新設(shè)計,以充分利用Python的優(yōu)勢,如使用生成器迭代集合的元素。
在Java和C++版本中,我們提供了很多偽代碼,而本書則提供了Python實現(xiàn)的完整代碼。
在一般情況下,ADT被定義為與Python內(nèi)建數(shù)據(jù)類型和Python的collections模塊具有一致的接口。
第5章深入探討了Python中基于動態(tài)數(shù)組的內(nèi)置數(shù)據(jù)結(jié)構(gòu),如list、tuple和str類。新增的附錄A提供了關(guān)于str類功能的進(jìn)一步講解。
重新繪制或修改了超過450幅插圖。
經(jīng)過新增和修訂,練習(xí)的總數(shù)達(dá)到750個。
在線資源
本書提供一系列豐富的在線資源,可訪問以下網(wǎng)站獲。
www.wiley.com/college/goodrich
鼓勵學(xué)生在學(xué)習(xí)本書時使用這個網(wǎng)址,以更有效地進(jìn)行練習(xí)并提高對所學(xué)知識的認(rèn)識。也歡迎教師使用本網(wǎng)站來幫助規(guī)劃、組織和展示他們的課程材料。對于教師和學(xué)生而言,網(wǎng)站中包含一系列與本書主題相關(guān)的教學(xué)資源,由于它們是有附加價值的,所以一些網(wǎng)上資源受密碼保護(hù)。
對于所有的讀者,尤其是學(xué)生,我們有以下資源:
書中所有Python程序的源代碼。
提供給教師的PDF講義版PPT(每頁四張)。
保存所有練習(xí)提示的數(shù)據(jù)庫,以練習(xí)的編號為索引。
對于使用本書的教師,我們有以下額外的教學(xué)輔助資源:
本書練習(xí)的答案。
書中所有圖形和插圖的彩色版本。
PPT和PDF版本的幻燈片,其中PDF版本為每頁一張。
PPT是完全可編輯的,教師可根據(jù)自己的課程需求進(jìn)行修改。在教師使用本書作為教材時,所有的在線資源不收取額外費(fèi)用。
內(nèi)容和組織
書中各章節(jié)的內(nèi)容循序漸進(jìn),適于教學(xué)。從Python編程和面向?qū)ο笤O(shè)計的基礎(chǔ)開始,然后逐漸增加如算法分析和遞歸之類的基礎(chǔ)技術(shù)。在本書的主體部分中,我們展示了基本的數(shù)據(jù)結(jié)構(gòu)和算法,并且包括對內(nèi)存管理的討論(也是數(shù)據(jù)結(jié)構(gòu)的架構(gòu)基礎(chǔ))。本書的章節(jié)安排如下:
第1章 Python入門
第2章 面向?qū)ο缶幊?
第3章 算法分析
第4章 遞歸
第5章 基于數(shù)組的序列
第6章 棧、隊列和雙端隊列
第7章 鏈表
第8章 樹
第9章 優(yōu)先級隊列
第10章 映射、哈希表和跳躍表
第11章 搜索樹
第12章 排序與選擇
第13章 文本處理
第14章 圖算法
第15章 內(nèi)存管理和B樹
附錄A Python中的字符串
附錄B 有用的數(shù)學(xué)定理
預(yù)備知識
我們假設(shè)讀者至少接觸過一種高級語言,如C、C++、Python或Java,可以理解相關(guān)高級語言的主要概念,包括:
變量和表達(dá)式。
決策結(jié)構(gòu)(if語句和switch語句)。
迭代結(jié)構(gòu)(for循環(huán)和while循環(huán))。
函數(shù)(無論是過程式方法還是面向?qū)ο蠓椒ǎ?
對于已經(jīng)熟悉這些概念但還不清楚如何在Python中應(yīng)用的讀者,我們建議將第1章作為Python語言的入門。這本書主要討論數(shù)據(jù)結(jié)構(gòu),而不是講解Python,因此并沒有詳盡介紹Python。
直到第2章才開始使用Python中的面向?qū)ο缶幊,這一章對于那些Python新手以及熟悉Python但不熟悉面向?qū)ο缶幊痰娜硕际怯杏玫摹?
就數(shù)學(xué)背景而言,我們假定讀者多少熟悉些高中數(shù)學(xué)知識。即便如此,在第3章中,我們先討論了算法分析的7個最重要的功能。若所涉及的內(nèi)容超出了這7個功能,則作為可選章節(jié),用星號(*)標(biāo)記。附錄B對其他有用的數(shù)學(xué)定理做了總結(jié),包括初等概率等。
計算機(jī)科學(xué)課程的設(shè)計
為了幫助教師在IEEE/ACM 2013的框架下設(shè)計教學(xué)課程,下表描述了本書涵蓋的知識要點(diǎn)。
知識要點(diǎn) 相關(guān)章節(jié)
AL/基本分析 第3章,4.2節(jié),12.2.4節(jié)
AL/算法策略 12.2.1節(jié),13.2.1節(jié),13.3節(jié),13.4.2節(jié)
AL/基本數(shù)據(jù)結(jié)構(gòu)與算法 4.1.3節(jié),5.5.2節(jié),9.4.1節(jié),9.3節(jié),10.2節(jié),11.1節(jié),13.2節(jié),第12章,第14章的大部分內(nèi)容
AL/高級數(shù)據(jù)結(jié)構(gòu) 5.3節(jié),10.4節(jié),11.2~11.6節(jié),12.3.1節(jié),13.5節(jié),14.5節(jié),15.3節(jié)
AR/內(nèi)存系統(tǒng)組織和架構(gòu) 第15章
DS/集合、關(guān)系和功能 10.5.1節(jié),10.5.2節(jié),9.4節(jié)
DS/證明技巧 3.4節(jié),4.2節(jié),5.3.2節(jié),9.3.6節(jié),12.4.1節(jié)
DS/基礎(chǔ)計數(shù) 2.4.2節(jié),6.2.2節(jié),12.2.4節(jié),8.2.2節(jié),附錄B
DS/圖和樹 第8章和第14章的大部分內(nèi)容
DS/離散概率 1.11節(jié),10.2節(jié),10.4.2節(jié),12.3.1節(jié)
PL/面向?qū)ο缶幊?本書的大部分內(nèi)容,特別是第2章以及7.4節(jié)、9.5.1節(jié)、10.1.3節(jié)和11.2節(jié)
PL/函數(shù)式編程 1.10節(jié)
SDF/算法和設(shè)計 2.1節(jié),3.3節(jié),12.2.1節(jié)
SDF/基本編程概念 第1章,第4章
SDF/基本數(shù)據(jù)結(jié)構(gòu) 第6章,第7章,附錄A,1.2.1節(jié),5.2節(jié),5.4節(jié),9.1節(jié),10.1節(jié)
SDF/開發(fā)方法 1.7節(jié),2.2節(jié)
SE/軟件設(shè)計 2.1節(jié),2.1.3節(jié)
邁克爾·T. 古德里奇(Michael T. Goodrich) 加州大學(xué)歐文分校計算機(jī)科學(xué)系教授,之前是約翰·霍普金斯大學(xué)教授。他是AAAS、ACM和IEEE會士,曾榮獲IEEE計算機(jī)協(xié)會技術(shù)成就獎和ACM卓越服務(wù)獎等。
羅伯托·塔馬西亞(Roberto Tamassia) 布朗大學(xué)計算機(jī)科學(xué)系教授及系主任,兼任幾何計算中心主任。他是AAAS、ACM和IEEE會士,曾榮獲IEEE計算機(jī)協(xié)會技術(shù)成就獎。
邁克爾·H.戈德瓦瑟(Michael H. Goldwasser) 圣路易斯大學(xué)數(shù)學(xué)系和計算機(jī)科學(xué)系教授,兼任計算機(jī)科學(xué)項目主任,之前曾在芝加哥羅耀拉大學(xué)任教。
出版者的話
譯者序
前言
致謝
作者簡介
第1章 Python入門 1
1.1 Python概述 1
1.1.1 Python解釋器 1
1.1.2 Python程序預(yù)覽 1
1.2 Python對象 2
1.2.1 標(biāo)識符、對象和賦值語句 2
1.2.2 創(chuàng)建和使用對象 4
1.2.3 Python的內(nèi)置類 4
1.3 表達(dá)式、運(yùn)算符和優(yōu)先級 8
1.4 控制流程 12
1.4.1 條件語句 12
1.4.2 循環(huán)語句 14
1.5 函數(shù) 16
1.5.1 信息傳遞 17
1.5.2 Python的內(nèi)置函數(shù) 19
1.6 簡單的輸入和輸出 20
1.6.1 控制臺輸入和輸出 21
1.6.2 文件 21
1.7 異常處理 22
1.7.1 拋出異常 23
1.7.2 捕捉異常 24
1.8 迭代器和生成器 26
1.9 Python的其他便利特點(diǎn) 28
1.9.1 條件表達(dá)式 29
1.9.2 解析語法 29
1.9.3 序列類型的打包和解包 30
1.10 作用域和命名空間 31
1.11 模塊和import語句 32
1.12 練習(xí) 34
擴(kuò)展閱讀 36
第2章 面向?qū)ο缶幊?37
2.1 目標(biāo)、原則和模式 37
2.1.1 面向?qū)ο蟮脑O(shè)計目標(biāo) 37
2.1.2 面向?qū)ο蟮脑O(shè)計原則 38
2.1.3 設(shè)計模式 39
2.2 軟件開發(fā) 40
2.2.1 設(shè)計 40
2.2.2 偽代碼 41
2.2.3 編碼風(fēng)格和文檔 42
2.2.4 測試和調(diào)試 43
2.3 類定義 44
2.3.1 例子:CreditCard類 45
2.3.2 運(yùn)算符重載和Python的特殊方法 48
2.3.3 例子:多維向量類 50
2.3.4 迭代器 51
2.3.5 例子:Range類 52
2.4 繼承 53
2.4.1 擴(kuò)展CreditCard類 54
2.4.2 數(shù)列的層次圖 57
2.4.3 抽象基類 60
2.5 命名空間和面向?qū)ο?62
2.5.1 實例和類命名空間 62
2.5.2 名稱解析和動態(tài)調(diào)度 65
2.6 深拷貝和淺拷貝 65
2.7 練習(xí) 67
擴(kuò)展閱讀 70
第3章 算法分析 71
3.1 實驗研究 71
3.2 本書使用的7種函數(shù) 74
3.2.1 常數(shù)函數(shù) 74
3.2.2 對數(shù)函數(shù) 74
3.2.3 線性函數(shù) 75
3.2.4 n-log-n函數(shù) 75
3.2.5 二次函數(shù) 76
3.2.6 三次函數(shù)和其他多項式 77
3.2.7 指數(shù)函數(shù) 77
3.2.8 比較增長率 79
3.3 漸近分析 79
3.3.1 大O符號 80
3.3.2 比較分析 82
3.3.3 算法分析示例 84
3.4 簡單的證明技術(shù) 89
3.4.1 示例 89
3.4.2 反證法 89
3.4.3 歸納和循環(huán)不變量 90
3.5 練習(xí) 91
擴(kuò)展閱讀 95
第4章 遞歸 96
4.1 說明性的例子 96
4.1.1 階乘函數(shù) 96
4.1.2 繪制英式標(biāo)尺 97
4.1.3 二分查找 99
4.1.4 文件系統(tǒng) 101
4.2 分析遞歸算法 104
4.3 遞歸算法的不足 106
4.4 遞歸的其他例子 109
4.4.1 線性遞歸 109
4.4.2 二路遞歸 112
4.4.3 多重遞歸 113
4.5 設(shè)計遞歸算法 114
4.6 消除尾遞歸 115
4.7 練習(xí) 116
擴(kuò)展閱讀 118
第5章 基于數(shù)組的序列 119
5.1 Python序列類型 119
5.2 低層次數(shù)組 119
5.2.1 引用數(shù)組 121
5.2.2 Python中的緊湊數(shù)組 122
5.3 動態(tài)數(shù)組和攤銷 124
5.3.1 實現(xiàn)動態(tài)數(shù)組 126
5.3.2 動態(tài)數(shù)組的攤銷分析 127
5.3.3 Python列表類 130
5.4 Python序列類型的效率 130
5.4.1 Python的列表和元組類 130
5.4.2 Python的字符串類 134
5.5 使用基于數(shù)組的序列 136
5.5.1 為游戲存儲高分 136
5.5.2 為序列排序 138
5.5.3 簡單密碼技術(shù) 140
5.6 多維數(shù)據(jù)集 142
5.7 練習(xí) 145
擴(kuò)展閱讀 147
第6章 棧、隊列和雙端隊列 148
6.1 棧 148
6.1.1 棧的抽象數(shù)據(jù)類型 148
6.1.2 簡單的基于數(shù)組的棧實現(xiàn) 149
6.1.3 使用棧實現(xiàn)數(shù)據(jù)的逆置 152
6.1.4 括號和HTML標(biāo)記匹配 152
6.2 隊列 155
6.2.1 隊列的抽象數(shù)據(jù)類型 155
6.2.2 基于數(shù)組的隊列實現(xiàn) 156
6.3 雙端隊列 160
6.3.1 雙端隊列的抽象數(shù)據(jù)類型 160
6.3.2 使用環(huán)形數(shù)組實現(xiàn)雙端隊列 161
6.3.3 Python collections模塊中的雙端隊列 162
6.4 練習(xí) 163
擴(kuò)展閱讀 165
第7章 鏈表 166
7.1 單向鏈表 166
7.1.1 用單向鏈表實現(xiàn)棧 169
7.1.2 用單向鏈表實現(xiàn)隊列 171
7.2 循環(huán)鏈表 173
7.2.1 輪轉(zhuǎn)調(diào)度 173
7.2.2 用循環(huán)鏈表實現(xiàn)隊列 174
7.3 雙向鏈表 175
7.3.1 雙向鏈表的基本實現(xiàn) 177
7.3.2 用雙向鏈表實現(xiàn)雙端隊列 179
7.4 位置列表的抽象數(shù)據(jù)類型 180
7.4.1 含位置信息的列表抽象數(shù)據(jù)類型 182
7.4.2 雙向鏈表實現(xiàn) 183
7.5 位置列表的排序 186
7.6 案例研究:維護(hù)訪問頻率 186
7.6.1 使用有序表 187
7.6.2 啟發(fā)式動態(tài)調(diào)整列表 188
7.7 基于鏈接的序列與基于數(shù)組的序列 190
7.8 練習(xí) 192
擴(kuò)展閱讀 195
第8章 樹 196
8.1 樹的基本概念 196
8.1.1 樹的定義和屬性 196
8.1.2 樹的抽象數(shù)據(jù)類型 199
8.1.3 計算深度和高度 201
8.2 二叉樹 203
8.2.1 二叉樹的抽象數(shù)據(jù)類型 204
8.2.2 二叉樹的屬性 206
8.3 樹的實現(xiàn) 207
8.3.1 二叉樹的鏈?zhǔn)酱鎯Y(jié)構(gòu) 207
8.3.2 基于數(shù)組表示的二叉樹 212
8.3.3 一般樹的鏈?zhǔn)酱鎯Y(jié)構(gòu) 214
8.4 樹的遍歷算法 214
8.4.1 樹的先序和后序遍歷 214
8.4.2 樹的廣度優(yōu)先遍歷 216
8.4.3 二叉樹的中