《啊哈!算法揭秘》圍繞程序設(shè)計典型算法,精心編織了一個場景,讓讀者通過本書學(xué)會優(yōu)先搜索、深度優(yōu)先搜索、迭代加深、并行算法、二分搜索等算法背后的原理,字符串、數(shù)組、棧和隊列等基本計算機科學(xué)概念,學(xué)習(xí)如何修改搜索算法以適應(yīng)不同的數(shù)據(jù)結(jié)構(gòu)、如何在特定情況下選擇的算法,以及何時應(yīng)該使用基于常識的啟發(fā)式算法,以加深對程序世界的理解。 本書的每一章都會伴隨情節(jié)引入一個新的算法概念,并在結(jié)尾處回顧總結(jié)本章內(nèi)出現(xiàn)的專業(yè)知識。
Jeremy Kubica 在 Google 任職首席工程師,著力于機器學(xué)習(xí)和算法方向。他擁有康奈爾大學(xué)的計算機科學(xué)本科學(xué)位和卡耐基梅隆大學(xué)的機器人專業(yè)博士學(xué)位。在研究生期間,他設(shè)計了一個算法,可以探測對地球有威脅的小行星(當(dāng)然,還尚未能阻止那些小行星)。Kubica 同時也是著名博客Computational Fairy Tales的作者。
啊哈磊:原名紀(jì)磊,畢業(yè)于武漢大學(xué)。曾在微軟亞洲研究院研發(fā)“爬蟲”,全國青少年信息學(xué)奧林匹克金牌教練。著有《啊哈C語言!邏輯的挑戰(zhàn)》和《啊哈!算法》系列編程書。李嘉浩:曾獲全國青少年信息學(xué)奧林匹克競賽金牌,國家集訓(xùn)隊*小選手。現(xiàn)就讀于美國麻省理工學(xué)院計算機科學(xué)及音樂雙專業(yè)。喜歡行走在科學(xué)與藝術(shù)的交接點。
第一章 搜索問題 1
警局檔案室里的幾百份卷宗莫名失蹤,警長求助Frank,一位幾年前被自己親自辭退的前警官。
警用算法導(dǎo)論:搜索問題 6
第二章 窮舉搜索尋線人 7
搜索第一站:Frank尋找“玻璃箱”Billy。作為一個靠分享信息過活的人,Billy這次竟然不愿透露信息。
警用算法導(dǎo)論:窮舉搜索 13
第三章 罪犯農(nóng)場里的數(shù)組和索引 15
搜索第二站:Frank在Crannock農(nóng)場偶遇Notation警官。雖然飽受Crannock夫婦的呵斥,F(xiàn)rank還是幸運地在數(shù)組車上找到一根珍貴的線頭。
警用算法導(dǎo)論:數(shù)組 22
第四章 字符串及隱藏的信息 23
Frank的回憶:初入警局時學(xué)習(xí)辨識Crannock農(nóng)場的指示牌信息,這個指示牌被用來傳播各種加了密的非法活動消息。
警用算法導(dǎo)論:字符串 26
第五章 對一艘走私船的二分搜索 27
搜索第三站:Frank和Notation來到Usb港,根據(jù)船只的到港時間快速鎖定走私船Retry Loop號。
警用算法導(dǎo)論:二分搜索Ⅰ 33
第六章 二分搜索尋線索 37
Frank和Notation假裝食品監(jiān)察員闖入Retry Loop號,快速翻看造假日志尋找蛛絲馬跡。
警用算法導(dǎo)論:二分搜索Ⅱ 43
第七章 調(diào)整算法,大膽逃離 45
他們被船上惡棍們拖上甲板,惡棍們的資歷是如此淺,以至于什么信息都套不出來。
警用算法導(dǎo)論:改編你的二分搜索法 54
第八章 Socks:一個突如其來的插曲 55
峰回路轉(zhuǎn),素不相識的小巫師Socks來營救,營救武器竟然是一桶桶的腌鰻魚。
第九章 倒退一步,繼續(xù)搜索 63
搜索第四站:Mudwall港口,與村民們再三確認(rèn),最近沒有船到港,一無所獲地離開。
警用算法導(dǎo)論:倒退一步 67
第十章 用廣度優(yōu)先搜索去開鎖 69
搜索第五站:Frayed Cable島,這里有一座廢棄的監(jiān)獄,Socks用咒語打開了監(jiān)獄大門的鎖。
警用算法導(dǎo)論:廣度優(yōu)先搜索 76
第十一章 廢棄監(jiān)獄中的深度優(yōu)先搜索 81
這座廢棄的監(jiān)獄像迷宮一樣,不過在Frank的帶領(lǐng)下,他們真的在這里找到了那些失蹤的卷宗!然而……
警用算法導(dǎo)論:深度優(yōu)先搜索 89
第十二章 餐廳中的棧和隊列 91
Frank的回憶:在警察學(xué)院的最初兩個月,F(xiàn)rank在餐廳打工,在一次偶然聊天中他意識到了數(shù)據(jù)結(jié)構(gòu)的重要性。
警用算法導(dǎo)論:棧和隊列Ⅰ 97
第十三章 用棧和隊列搜索 101
廢棄監(jiān)獄里房間的門突然關(guān)閉,卷宗被燃燒,重要線索被毀,他們落荒而逃。
警用算法導(dǎo)論:棧和隊列Ⅱ 106
第十四章 分頭行動——并行搜索 109
返回Usb港的途中,F(xiàn)rank決定上岸后將Notation和Socks支開,因為他感覺自己無法相信任何人。
警用算法導(dǎo)論:并行算法 115
第十五章 迭代加深可以救你的命 117
Mavis的回憶:在自己還是學(xué)徒的一次出海中,雖然地圖丟失了,他們?nèi)匀挥靡环N看似笨拙的方法在茫茫大海中找到了補給站。
警用算法導(dǎo)論:迭代加深 125
第十六章 逆向索引:縮小搜索范圍 127
搜索第六站:上岸后Frank拿著在Crannock農(nóng)場找到的線頭去請教披風(fēng)專家Cloaksworth 先生,確認(rèn)這是一件被施了咒語的警察披風(fēng)上的線頭。
警用算法導(dǎo)論:逆向索引 132
第十七章 二叉搜索樹陷阱 135
謝過Cloaksworth先生后Frank走在街上,發(fā)現(xiàn)自己被探子跟蹤了。他轉(zhuǎn)而去追探子,被引入了下水道內(nèi)建造的高高的二叉搜索梯。
警用算法導(dǎo)論:二叉搜索樹Ⅰ 142
第十八章 建造二叉搜索梯 145
Frank一層層爬下梯子,然而爬到最后一層時他受傷了。探子放鐵蛇來圍攻,F(xiàn)rank艱難爬回地面。
警用算法導(dǎo)論:二叉搜索樹Ⅱ 150
第十九章 疑犯的二叉搜索樹 151
搜索第七站:調(diào)查調(diào)職記錄,F(xiàn)rank讓Socks生成巨大的閃閃發(fā)光的魔法樹,但是沒能找到任何可疑之處。
警用算法導(dǎo)論:二叉搜索樹Ⅲ 160
第二十章 將疑犯加到搜索樹中 163
Frank決定帶著魔法樹去見警長,不過途中他們停在了警局記錄處,他們需要向魔法樹中增加一些節(jié)點。
警用算法導(dǎo)論:二叉搜索樹Ⅳ 169
第二十一章 二叉搜索樹的屬性 171
在增加節(jié)點的過程中,Socks犯了“小”錯誤,這引起了Frank的抱怨、咒罵和懷疑。
警用算法導(dǎo)論:二叉搜索樹Ⅴ 173
第二十二章 公文字典樹 175
途中他們又來到警局檔案室,F(xiàn)rank得以在事故現(xiàn)場偵察,在這里他找到了新的線索。
警用算法導(dǎo)論:trie樹 179
第二十三章 最佳優(yōu)先搜索:偵探最值得信賴的工具 183
Frank與警長交談,發(fā)現(xiàn)事態(tài)比想象中的更緊迫而嚴(yán)重:攻擊城堡的計劃、強大的魔法面具、危險的邪惡巫師聯(lián)盟……
警用算法導(dǎo)論:最佳優(yōu)先搜索 190
第二十四章 用優(yōu)先隊列進(jìn)行調(diào)查 193
Notation受到警長嚴(yán)厲批評,被停職,因為她一直在擅自調(diào)查不屬于自己的案件。
警用算法導(dǎo)論:優(yōu)先隊列 199
第二十五章 用優(yōu)先隊列來解鎖 201
Frank想回到自己的辦公室,卻發(fā)現(xiàn)再次被跟蹤了,他甩掉探子,巧妙地解開安全屋的密碼,躲進(jìn)了安全屋。
警用算法導(dǎo)論:數(shù)據(jù)結(jié)構(gòu)和搜索 205
第二十六章 啟發(fā)式搜索 207
搜索第八站:安全屋里的靜心反思。Frank反復(fù)研究著找到的所有線索,忽然他開始懷疑之前的所有推斷?煽康木索用盡了,模糊的線索也沒有了……
警用算法導(dǎo)論:啟發(fā)式搜索 210
第二十七章 警察學(xué)院中的“堆” 213
Loop教授的回憶:警察學(xué)院基于教齡分配辦公室,95歲的Loop教授有長達(dá)70年的教齡,終于爭奪到了本應(yīng)屬于自己的辦公室。
警用算法導(dǎo)論:堆 219
第二十八章 搜索難題 223
搜索第九站:Frank向Loop教授請教咒語知識。巫術(shù)犯罪學(xué)是一個危險的領(lǐng)域,而Loop教授卻一直能夠幸存下來。在這里Frank終于厘清了線索。
警用算法導(dǎo)論:期末考試復(fù)習(xí)課 229
第二十九章 搜索終點站 231
Frank與Notation來到警局的監(jiān)獄,一舉抓獲戴著魔法面具、試圖解救自己首領(lǐng)的小巫師,沒錯,他就是一路同行的Socks。
結(jié) 語 239