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