在編寫(xiě)代碼時(shí),每位軟件專(zhuān)業(yè)人士都需要對(duì)算法有充分的理解。在這本實(shí)用性極強(qiáng)的著作中,作者對(duì)一些關(guān)鍵的算法進(jìn)行了詳實(shí)的描述,可以有效地提高用各種語(yǔ)言編寫(xiě)代碼的質(zhì)量。軟件開(kāi)發(fā)人員、測(cè)試人員和維護(hù)人員可以在本書(shū)中學(xué)會(huì)如何使用算法,以創(chuàng)造性的方式解決計(jì)算性問(wèn)題。
本書(shū)各章內(nèi)容前后銜接緊密,環(huán)環(huán)相扣,用醒目的圖表有條不紊地展示了一些核心概念,并對(duì)書(shū)中介紹的每種算法的性能進(jìn)行了分析。在每一章的最后,讀者需要應(yīng)用在該章所學(xué)習(xí)的知識(shí),解決一個(gè)新穎的具有挑戰(zhàn)性的問(wèn)題,就像在參加技術(shù)面試。
在本書(shū)中,讀者將會(huì):
學(xué)習(xí)計(jì)算機(jī)科學(xué)和軟件工程中非常重要且基本的算法;
學(xué)習(xí)高效解決問(wèn)題的常用策略,包括分治法、動(dòng)態(tài)規(guī)劃等;
使用大O表示法對(duì)代碼進(jìn)行分析,評(píng)估它的時(shí)間復(fù)雜度;
在算法中使用現(xiàn)有的Python程序庫(kù)和數(shù)據(jù)結(jié)構(gòu)解決問(wèn)題;
理解重要算法的主要步驟。
(1)對(duì)關(guān)鍵算法、數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)類(lèi)型進(jìn)行詳實(shí)的描述,有效提高用各種語(yǔ)言編寫(xiě)代碼的質(zhì)量。
(2)在解釋算法的工作原理時(shí),像講故事一樣娓娓道來(lái),并提供大量的實(shí)驗(yàn)數(shù)據(jù),對(duì)不同算法的運(yùn)行時(shí)間性能進(jìn)行比較。
(3)所提供的算法實(shí)現(xiàn),采用的是實(shí)際代碼而不是偽代碼,讀者可以直接運(yùn)行這些代碼,切身感受算法的行為和性能。
(4)書(shū)中描述算法的Python 代碼并沒(méi)有使用任何復(fù)雜的語(yǔ)法結(jié)構(gòu),因此對(duì)Python 稍有了解甚至不了解的讀者(當(dāng)然至少要熟悉一種其他編程語(yǔ)言),在閱讀本書(shū)的代碼時(shí)應(yīng)該也不會(huì)感到困難。
喬治·海涅曼(George T. Heineman)是一位計(jì)算機(jī)科學(xué)教授,在軟件工程和算法領(lǐng)域有超過(guò)20 年的教學(xué)經(jīng)驗(yàn)。他是《算法技術(shù)手冊(cè)》(第2版)的作者,也是很多O’Reily視頻培訓(xùn)課程的講師,其中包括“Exploring Algorithms in Python”和“Working with Algorithms in Python”。他終身愛(ài)好邏輯題和數(shù)學(xué)智力題,他是Sujiken智力游戲(數(shù)獨(dú)的一種變型)和Trexagon 智力游戲的發(fā)明者。
序 1
前言 3
第 1 章 解決問(wèn)題 9
1.1 什么是算法? 9
1.2 在一個(gè)任意的列表中查找最大值 12
1.3 對(duì)關(guān)鍵操作進(jìn)行計(jì)數(shù) 14
1.4 可以預(yù)測(cè)算法性能的模型 14
1.5 在一個(gè)隨機(jī)列表中查找兩個(gè)最大值 19
1.6 錦標(biāo)賽算法 22
1.7 時(shí)間復(fù)雜度和空間復(fù)雜度 28
1.8 總結(jié) 29
1.9 挑戰(zhàn)練習(xí) 30
第 2 章 分析算法 33
2.1 使用實(shí)驗(yàn)?zāi)P皖A(yù)測(cè)性能 34
2.2 乘法可以更快 36
2.3 性能分類(lèi) 38
2.4 漸進(jìn)性分析 39
2.5 對(duì)所有操作進(jìn)行計(jì)數(shù) 42
2.6 對(duì)所有字節(jié)進(jìn)行計(jì)數(shù) 43
2.7 關(guān)上一扇門(mén),打開(kāi)另一扇門(mén) 44
2.8 二分?jǐn)?shù)組搜索 45
2.9 幾乎和π 一樣簡(jiǎn)單 46
2.10 一石二鳥(niǎo) 48
2.11 綜述 52
2.12 曲線(xiàn)擬合與上下界的比較 53
2.13 總結(jié) 54
2.14 挑戰(zhàn)練習(xí) 55
第3 章 更好的散列,更適意的人生 58
3.1 值與鍵相關(guān)聯(lián) 58
3.2 散列函數(shù)和散列碼 63
3.3 (key,value)對(duì)的可散列結(jié)構(gòu) 64
3.4 使用線(xiàn)性探查法檢測(cè)和解決沖突 65
3.5 用鏈表實(shí)現(xiàn)分離鏈表 70
3.6 從鏈表中刪除一個(gè)數(shù)據(jù)項(xiàng) 73
3.7 評(píng)估 75
3.8 增長(zhǎng)的散列表 78
3.9 分析動(dòng)態(tài)散列表的性能 83
3.10 完美散列 84
3.11 對(duì)(key,value)對(duì)進(jìn)行迭代 87
3.12 總結(jié) 88
3.13 挑戰(zhàn)練習(xí) 89
第4 章 堆起來(lái)! 93
4.1 最大二叉堆 99
4.2 插入(value,priority)對(duì) 101
4.3 刪除具有最高優(yōu)先級(jí)的值 104
4.4 用數(shù)組表示二叉堆 106
4.5 實(shí)現(xiàn)上浮和下沉 107
4.6 總結(jié) 111
4.7 挑戰(zhàn)練習(xí) 112
第5 章 深入淺出論排序! 115
5.1 交換排序 116
5.2 選擇排序 117
5.3 平方時(shí)間級(jí)排序算法的剖析 119
5.4 分析插入排序和選擇排序的性能 121
5.5 遞歸和分治法 122
5.6 歸并排序 127
5.7 快速排序 131
5.8 堆排序 134
5.9 O(NlogN)等級(jí)算法的性能比較 136
5.10 Tim 排序 137
5.11 總結(jié) 140
5.12 挑戰(zhàn)練習(xí) 140
第6 章 二叉樹(shù):掌上世界的無(wú)限可能 142
6.1 基礎(chǔ)知識(shí) 142
6.2 二叉查找樹(shù) 147
6.3 在二叉查找樹(shù)中搜索值 152
6.4 從二叉查找樹(shù)刪除值 153
6.5 遍歷二叉查找樹(shù) 157
6.6 分析二叉查找樹(shù)的性能 159
6.7 平衡二叉樹(shù) 161
6.8 分析平衡二叉樹(shù)的性能 168
6.9 使用二叉樹(shù)作為(key,value)符號(hào)表 168
6.10 使用二叉樹(shù)作為優(yōu)先隊(duì)列 169
6.11 總結(jié) 172
6.12 挑戰(zhàn)練習(xí) 173
第7 章 圖:連得上的才是好的! 176
7.1 圖高效地存儲(chǔ)了實(shí)用的信息 176
7.2 使用深度優(yōu)先搜索解決迷宮問(wèn)題 181
7.3 廣度優(yōu)先搜索提供了一種不同的搜索算法 186
7.4 有向圖 193
7.5 具有邊權(quán)重的圖 200
7.6 迪杰斯特拉算法 202
7.7 全頂點(diǎn)對(duì)的最短路徑 212
7.8 弗洛伊德-沃歇爾算法 215
7.9 總結(jié) 219
7.10 挑戰(zhàn)練習(xí) 220
第8 章 綜述 . 223
8.1 Python 的內(nèi)置數(shù)據(jù)類(lèi)型 225
8.2 在Python 中實(shí)現(xiàn)堆棧 227
8.3 在Python 中實(shí)現(xiàn)隊(duì)列 228
8.4 堆和優(yōu)先隊(duì)列的實(shí)現(xiàn) 229
8.5 進(jìn)一步的探索 229