這是一本介紹通過解決復雜謎題來學習編程的書,書中的代碼用Python語言編寫。與以往的編程書不同,本書將對代碼功能的理解與編程語言語法和語義的理解分離開來,從解每個謎題開始,先給出解謎題的算法,隨后用Python語法和語義實現(xiàn)對應的算法,并適當做出解釋。本書包含了21個謎題,其中很多謎題都廣為流傳,如多皇后、漢諾塔、在幾秒鐘內解決數(shù)獨問題、驗證六度分隔猜想等,每個謎題后面都配有不同難度的編程習題,幫讀者加深對相關算法的理解。
本書在算法謎題的趣味性和計算機編程的實用性之間搭建了一座橋梁,內容饒有趣味,講述易于理解,適合已掌握初級編程概念并對算法感興趣的學習者閱讀和參考。
很少有初學編程的人愿意為了編程而編程,本書創(chuàng)新地通過求解有趣的謎題來教授讀者編程,為枯燥的編程學習過程注入了很強的趣味性,謎題是來自真實世界的應用,饒有趣味、易于描述。
學習編程是從解謎題開始的,在經(jīng)歷一兩次失敗的解謎嘗試后,讀者會豁然開朗——可能是一種搜索策略、一個數(shù)據(jù)結構或一個數(shù)學公式,謎題的算法就躍然而出了,剩下的事情就是用Python語法和語義將算法“翻譯”成可實現(xiàn)的代碼。
讀者只需掌握初級的編程概念,就可以閱讀本書。本書包含了21 個謎題,其中很多謎題都家喻戶曉并廣為流傳,如多皇后、漢諾塔、在幾秒鐘內解決數(shù)獨問題、六度分隔等。每個謎題后面都配有不同難度的編程習題,讀者可以先自行完成編碼,再對照本書給出的答案進行探索和提升。
作者簡介
斯里尼·德瓦達斯(Srini Devadas) 麻省理工學院(MIT)計算機科學和人工智能實驗室(CSAIL)電子工程和計算機科學教授,自1988年起在麻省理工學院任教。他目前的研究興趣主要集中在計算機體系結構、計算機安全和應用密碼學領域。他因其研究成就獲得了2014年IEEE計算機學會技術成就獎、2015年ACM/IEEE理查德·牛頓技術影響力獎和2017年IEEE華萊士·麥克道爾獎。他在MIT教授編程基礎、算法導論和算法設計與分析等課程。
譯者簡介
戴 旭 高級項目管理師,從事金融信息化和電子政務工作多年,現(xiàn)為杭州城市大腦研發(fā)團隊成員,譯有《Python快速入門》《Android平板電腦開發(fā)秘籍》《編寫高性能的.NET代碼》等。
李亞舟 現(xiàn)任職于知乎,負責數(shù)據(jù)庫平臺,關注存儲、分布式系統(tǒng)、容器等技術,譯有《Haskell趣學指南》。
許亞運 曾任職于高德、餓了么,有多年互聯(lián)網(wǎng)行業(yè)后端開發(fā)經(jīng)驗,愛好Python,喜歡探索新技術。
謎題1 保持一致 1
1.1 尋找想法相同的連續(xù)人員 2
1.2 字符串、列表和元組 3
1.3 從算法到代碼 4
1.4 代碼優(yōu)化 7
1.5 列表創(chuàng)建與修改 7
1.6 作用域 8
1.7 算法優(yōu)化 9
1.8 單遍算法 9
1.9 應用 10
1.10 習題 11
謎題2 參加派對的最佳時間 13
2.1 反復檢查時間 14
2.2 聰明地檢查時間 16
2.3 有序的表示 20
2.4 習題 20
謎題3 擁有(需要一點校準的)讀心術 22
3.1 編程完成助手的工作 24
3.2 編程完成魔術師的任務 28
3.3 獨自掌握技巧 29
3.4 信息編碼 31
3.5 4張牌的魔術戲法 31
3.6 習題 32
謎題4 讓皇后保持分離 34
4.1 系統(tǒng)地搜索 36
4.2 用二維列表(數(shù)組)表示棋盤 38
4.3 用一維列表(數(shù)組)表示棋盤 41
4.4 迭代枚舉 45
4.5 習題 46
謎題5 請打碎水晶 47
5.1 兩顆球的高效搜索 48
5.2 d顆球的高效搜索 49
5.3 對兩顆球減少拋球次數(shù) 53
5.4 習題 54
謎題6 尋找假幣 55
6.1 分治 55
6.2 遞歸分治 57
6.3 三進制表示 60
6.4 稱量謎題一個流行的變體 61
6.5 習題 61
謎題7 跳到平方根 62
7.1 迭代查找 62
7.2 折半查找 65
7.3 二分搜索 67
7.4 三分搜索 69
7.5 習題 69
謎題8 猜猜誰不來吃晚餐 71
8.1 第 一次嘗試 72
8.2 始終尋找最大選擇 73
8.3 生成所有組合 74
8.4 移除不友好的組合 76
8.5 選擇最大組合 76
8.6 優(yōu)化內存使用 77
8.7 應用 78
8.8 習題 79
謎題9 美國達人秀 81
9.1 每次生成并測試一個組合 83
9.2 確定缺少一門絕活的組合 84
9.3 應用 85
9.4 習題 86
謎題10 多皇后 88
10.1 遞歸求取最大公約數(shù) 88
10.2 遞歸獲取斐波那契數(shù)列 89
10.3 遞歸求解N皇后問題 91
10.4 遞歸的應用 94
10.5 習題 96
謎題11 請滿鋪庭院 98
11.1 歸并排序 99
11.2 歸并排序的執(zhí)行與分析 101
11.3 基線條件即2 × 2庭院 102
11.4 遞歸步驟 103
11.5 列表推導式的基礎知識 107
11.6 美觀打印 107
11.7 另一個滿鋪謎題 109
11.8 習題 109
謎題12 漢諾塔 111
12.1 漢諾塔的遞歸解決方案 112
12.2 相鄰漢諾塔的遞歸解決方案 114
12.3 與格雷碼的關系 117
12.4 習題 118
謎題13 沒條理的工匠 121
13.1 分治時的圍繞基準點分揀 122
13.2 與排序算法的關系 123
13.3 原地劃分 126
13.4 排序也瘋狂 129
13.5 習題 129
謎題14 再也不玩數(shù)獨了 131
14.1 遞歸式數(shù)獨求解 132
14.2 遞歸搜索過程中的推理 136
14.3 數(shù)獨謎題的難度 140
14.4 習題 141
謎題15 統(tǒng)計零錢的組合方式 143
15.1 鈔票的遞歸選取 143
15.2 消除重復 145
15.3 用最少的鈔票支付 147
15.4 習題 148
謎題16 貪心是好事 150
16.1 貪心算法 151
16.2 最短歷時規(guī)則 151
16.3 最早開始時間規(guī)則 151
16.4 最少沖突規(guī)則 152
16.5 最早結束時間規(guī)則 152
16.6 貪心算法何時有效 157
16.7 習題 158
謎題17 字母也瘋狂 160
17.1 每次找到一組變位詞 160
17.2 通過排序對變位詞進行分組 162
17.3 通過散列操作對變位詞進行分組 164
17.4 字典 165
17.5 用字典對變位詞進行分組 167
17.6 散列表 169
17.7 習題 171
謎題18 充分利用記憶 173
18.1 遞歸解決方案 173
18.2 回溯硬幣的選擇過程 175
18.3 memoization技術 178
18.4 避免使用異!179
18.5 動態(tài)規(guī)劃 180
18.6 習題 180
謎題19 要記得周末 184
19.1 找到分區(qū) 185
19.2 二分圖的判別 187
19.3 圖的表示 189
19.4 圖的著色 192
19.5 習題 193
謎題20 六度分隔 195
20.1 廣度優(yōu)先搜索 197
20.2 集合 198
20.3 在廣度優(yōu)先搜索中使用集合 199
20.4 歷史 202
20.5 習題 203
謎題21 問題有價 205
21.1 用字典構造二叉查找樹 207
21.2 字典形式下的二叉查找樹操作 209
21.3 面向對象風格的二叉查找樹 212
21.4 回到謎題:算法 216
21.5 解決謎題的代碼 218
21.6 多種數(shù)據(jù)結構的對比 222
21.7 習題 222