算法設(shè)計(jì)與分析實(shí)踐案例解析
定 價(jià):49 元
叢書(shū)名:面向數(shù)字化時(shí)代高等學(xué)校計(jì)算機(jī)系列教材
- 作者:楊烜、李炎然、吳定明
- 出版時(shí)間:2024/12/1
- ISBN:9787302698845
- 出 版 社:清華大學(xué)出版社
- 中圖法分類(lèi):TP301.6
- 頁(yè)碼:
- 紙張:膠版紙
- 版次:
- 開(kāi)本:16開(kāi)
算法設(shè)計(jì)與分析是計(jì)算類(lèi)專(zhuān)業(yè)的核心課程,學(xué)生在學(xué)習(xí)該課程時(shí),普遍更容易理解理論,卻常常無(wú)從下手解決一個(gè)實(shí)際問(wèn)題。如何將理論知識(shí)應(yīng)用到實(shí)踐中解決實(shí)際問(wèn)題?本書(shū)從計(jì)算思維培養(yǎng)的角度,將算法設(shè)計(jì)的思想利用通俗易懂的實(shí)例進(jìn)行解釋?zhuān)峁┐罅繉?shí)際問(wèn)題、案例進(jìn)行分析,希望學(xué)生能通過(guò)大量的實(shí)例分析建立一種有效的思維方式(計(jì)算思維),掌握求解問(wèn)題的思路,進(jìn)而提高解決實(shí)際問(wèn)題的能力。本書(shū)作為計(jì)算機(jī)專(zhuān)業(yè)的核心課程“算法設(shè)計(jì)與分析”的輔助教材,適用于計(jì)算機(jī)專(zhuān)業(yè)的高年級(jí)學(xué)生閱讀,通過(guò)實(shí)踐案例拓展眼界,提高實(shí)踐能力。
本書(shū)提供大量實(shí)際問(wèn)題、案例,有助于培養(yǎng)計(jì)算思維。
前言
雖然自己講授“算法設(shè)計(jì)與分析”課程很多年了,但是一直沒(méi)有想過(guò)寫(xiě)一本書(shū)。去年,應(yīng)清華大學(xué)出版社邀約,萌生了寫(xiě)一本書(shū)的想法。為什么講了這么多年課,直到現(xiàn)在才有寫(xiě)書(shū)的想法呢?一個(gè)主要原因就是我越來(lái)越強(qiáng)烈地感覺(jué)到:學(xué)生雖然能夠理解課堂講授的理論知識(shí),但是在解決實(shí)際問(wèn)題時(shí),他們似乎難以下手。
為什么會(huì)有這種現(xiàn)象呢?我仔細(xì)思考之后,找到了一個(gè)關(guān)鍵的問(wèn)題!八惴ㄔO(shè)計(jì)與分析”這門(mén)課程的理論是比較抽象的,雖然不難理解,但它就像天上的云一樣,不容易落地。那么,如何能讓理論知識(shí)落地,指引讀者去解決實(shí)際問(wèn)題呢?這就好像踢足球,如果只是聽(tīng)別人講如何踢足球,一般人都能聽(tīng)懂,但是聽(tīng)懂了并不代表自己會(huì)了,如果要會(huì)踢足球,還需要大量的練習(xí)。
對(duì)于“算法設(shè)計(jì)與分析”這門(mén)課程而言,掌握理論知識(shí)之后也需要大量練習(xí),那么怎樣練習(xí)呢?就是在實(shí)際案例中去應(yīng)用。但是在應(yīng)用時(shí)需要注意,目標(biāo)不能僅僅是解決某個(gè)問(wèn)題,而要關(guān)注解決這個(gè)問(wèn)題背后的思想方法。舉一個(gè)簡(jiǎn)單的例子,假設(shè)我們要設(shè)計(jì)一個(gè)效率是O(logn)的算法求xn的值,其中x和n都是已知的。如果僅從解決問(wèn)題的角度,可以利用n的二進(jìn)制表達(dá)逐位處理,也可以達(dá)到O(logn)的效率。但是如果讀者想要練習(xí)算法設(shè)計(jì)思想,就要分析這個(gè)問(wèn)題的結(jié)構(gòu),也就是xn=xn/2×xn/2,從這個(gè)結(jié)構(gòu)可以看出,原問(wèn)題xn和子問(wèn)題xn/2是一樣的,僅僅是問(wèn)題的規(guī)模有所區(qū)別,這樣就出現(xiàn)了分治法求解的算法設(shè)計(jì)思路了,即原問(wèn)題被分解為兩個(gè)子問(wèn)題。如果定義函數(shù)F(n)=xn,然后簡(jiǎn)單地利用F(n)=F(n/2)×F(n/2)的思路寫(xiě)代碼,就會(huì)導(dǎo)致效率達(dá)到O(n),而不是O(logn),這個(gè)分析過(guò)程可以利用遞歸算法效率分析的方法推導(dǎo)出。這時(shí),我們就能發(fā)現(xiàn)這里的核心問(wèn)題是子問(wèn)題求解了兩次,如果能求解一次子問(wèn)題,就可以達(dá)到O(logn)的算法效率。這樣,算法優(yōu)化的思想就清晰了,我們可以把子問(wèn)題的解F(n/2)存起來(lái),并通過(guò)這個(gè)臨時(shí)變量來(lái)計(jì)算F(n),而不是調(diào)用兩次子問(wèn)題求解,就可以提高算法效率。
上面這個(gè)簡(jiǎn)單的例子說(shuō)明,算法設(shè)計(jì)與分析在實(shí)踐的過(guò)程中,我們更需要關(guān)注的是如何分析問(wèn)題的結(jié)構(gòu),原問(wèn)題與子問(wèn)題有什么關(guān)系?什么樣的算法設(shè)計(jì)策略適合解決這個(gè)問(wèn)題?又如何通過(guò)效率分析進(jìn)一步優(yōu)化算法?而不是僅僅關(guān)注如何得到這個(gè)問(wèn)題的解。所以,我想在這本書(shū)里表達(dá)的一個(gè)思想就是,希望各位讀者在每個(gè)案例中關(guān)注算法設(shè)計(jì)的思想如何體現(xiàn)的、算法設(shè)計(jì)的思路是怎樣的。如果能從這些角度去理解書(shū)中提供的案例,可能會(huì)對(duì)各位讀者更有幫助。
本書(shū)基于Thomas H.Cormen等編寫(xiě)的著名教材《算法導(dǎo)論》中的部分內(nèi)容,介紹了算法設(shè)計(jì)的基本策略,例如分治法、貪心法、動(dòng)態(tài)規(guī)劃等,同時(shí)簡(jiǎn)單介紹了算法效率分析中的漸進(jìn)效率和攤還分析方法。由于這些內(nèi)容在原著中都有表述,本書(shū)盡量從通俗易懂的角度對(duì)算法思想進(jìn)行了解釋?zhuān)瑫r(shí)增加了回溯法的算法設(shè)計(jì)方法。本書(shū)收集了各種算法設(shè)計(jì)的案例,并且致力于把這些案例實(shí)現(xiàn)的思想解釋清楚,讓讀者在多個(gè)案例里不斷練習(xí),逐漸建立計(jì)算思維的思維方式,從而在遇到一個(gè)實(shí)際問(wèn)題時(shí),能有一個(gè)下手的思路,通過(guò)分析問(wèn)題的結(jié)構(gòu)去尋找求解問(wèn)題的方法。
算法設(shè)計(jì)與分析實(shí)踐案例解析前言寫(xiě)書(shū)實(shí)在是一個(gè)漫長(zhǎng)而痛苦的過(guò)程,對(duì)于每個(gè)案例,我在梳理思路時(shí)同樣感到吃力。然而,這也是一個(gè)快速提升的過(guò)程。由于本人能力有限,書(shū)中一些算法思想的表達(dá)只是個(gè)人的一些理解,難免有不準(zhǔn)確的地方,請(qǐng)各位讀者指正。
本書(shū)中的多個(gè)案例與求解算法來(lái)自GeeksforGeeks官網(wǎng)、斯坦福大學(xué)的CS166: Advanced Data Structures課程、杜克大學(xué)的CPS 230: Design and Analysis of Algorithms課程、麻省理工學(xué)院公開(kāi)課資源的Advanced Algorithms課程的部分課件,在此表示衷心感謝。
本書(shū)由“深圳大學(xué)教材建設(shè)項(xiàng)目”資助。在本書(shū)的撰寫(xiě)過(guò)程中,兩位參編老師李炎然、吳定明做了很多工作。其中,李炎然老師提供了大量的動(dòng)態(tài)規(guī)劃案例,這些案例都是李老師自己設(shè)計(jì)的。吳定明老師在圖論方面提供了很多好的資料,拓寬了本書(shū)的案例深度和廣度。深圳大學(xué)計(jì)算機(jī)與軟件學(xué)院2021級(jí)學(xué)生曹婉楠,2022級(jí)學(xué)生陳愷斌、陳碧晗、黃德海、黃雨欣參與了本書(shū)的資料整理,在此表示深深的感謝。同時(shí),感謝深圳大學(xué)計(jì)算機(jī)與軟件學(xué)院算法設(shè)計(jì)與分析課程組全體老師的支持!
楊烜
2025年7月
楊烜,教授,博士生導(dǎo)師,深圳大學(xué)計(jì)算機(jī)與軟件學(xué)院教學(xué)副院長(zhǎng),1991年畢業(yè)于西安電子科技大學(xué),獲學(xué)士學(xué)位,1994、1998年畢業(yè)西安交通大學(xué)獲碩士、博士學(xué)位,1998年至2001年期間在西安電子科技大學(xué)博士后流動(dòng)站工作,2001年至今在深圳大學(xué)工作。主持完成科技支撐計(jì)劃項(xiàng)目課題一項(xiàng),國(guó)家自然科學(xué)面上項(xiàng)目三項(xiàng),作為參研單位主持人完成國(guó)家自然科學(xué)廣東省聯(lián)合一項(xiàng),國(guó)家重點(diǎn)實(shí)驗(yàn)室項(xiàng)目一項(xiàng),廣東省自然科學(xué)一項(xiàng),深圳市科技計(jì)劃項(xiàng)目多項(xiàng)。獲得總參科技進(jìn)步二等獎(jiǎng)一項(xiàng),陜西省科學(xué)技術(shù)三等獎(jiǎng)一項(xiàng),陜西高等學(xué)?茖W(xué)技術(shù)一等獎(jiǎng)一項(xiàng)。深圳市教師,獲國(guó)家教學(xué)成果二等獎(jiǎng)一項(xiàng),廣東省教學(xué)成果一等獎(jiǎng)一項(xiàng)。
目錄
配套資源
第1章算法和計(jì)算思維1
1.1算法基本概念及效率分析1
1.1.1什么是算法1
1.1.2算法設(shè)計(jì)的基本過(guò)程2
1.1.3算法效率分析的基本方法3
1.2算法與計(jì)算思維11
第2章分治法13
2.1分治法概述13
2.2分治法中的計(jì)算思維15
2.3分治法的實(shí)踐案例16
2.3.1求第k個(gè)數(shù)16
2.3.2粉刷問(wèn)題21
2.3.3棋盤(pán)覆蓋問(wèn)題24
2.3.4數(shù)組的反轉(zhuǎn)計(jì)數(shù)27
2.3.5天際線問(wèn)題32
2.3.6凸包問(wèn)題36
第3章回溯法45
3.1回溯法概述45
3.2剪枝48
3.3回溯法與尋優(yōu)問(wèn)題49
3.4回溯法與分支界限法50
3.5回溯法中的計(jì)算思維51
3.6回溯法的實(shí)踐案例52
3.6.1數(shù)獨(dú)問(wèn)題52
3.6.2騎士巡游問(wèn)題55
3.6.3子集劃分問(wèn)題58
3.6.4括號(hào)生成問(wèn)題61
3.6.5地圖填色問(wèn)題62
3.6.6運(yùn)算表達(dá)式優(yōu)先級(jí)66
第4章動(dòng)態(tài)規(guī)劃68
4.1動(dòng)態(tài)規(guī)劃概述68
4.2動(dòng)態(tài)規(guī)劃中的計(jì)算思維71
4.3動(dòng)態(tài)規(guī)劃的實(shí)踐案例72
4.3.1最長(zhǎng)等差子序列72
4.3.2子系列和最大問(wèn)題74
4.3.3獲益最大問(wèn)題76
4.3.4圖像編碼問(wèn)題80
4.3.5最長(zhǎng)不重疊子串問(wèn)題83
4.3.6粉刷問(wèn)題85
4.3.7樹(shù)的最大高度問(wèn)題87
4.3.8分割等和子集問(wèn)題92
4.3.9跳躍問(wèn)題96
4.3.10最長(zhǎng)嚴(yán)格遞增子序列100
4.3.11回文串劃分問(wèn)題102
4.3.12括號(hào)生成問(wèn)題110
4.3.13作業(yè)調(diào)度問(wèn)題112
第5章貪心法115
5.1貪心法概述115
5.2貪心法中的計(jì)算思維117
5.3貪心法的實(shí)踐案例117
5.3.1最少站臺(tái)問(wèn)題117
5.3.2最短超級(jí)字符串121
5.3.3重排字符串問(wèn)題124
5.3.4圖頂點(diǎn)填色問(wèn)題127
5.3.5奶茶找零問(wèn)題129
5.3.6將整數(shù)n變成1131
第6章圖論算法134
6.1圖論基本算法134
6.1.1圖的基本概念134
6.1.2圖的數(shù)據(jù)結(jié)構(gòu)表示136
6.1.3廣度優(yōu)先搜索136
6.1.4深度優(yōu)先搜索138
6.1.5圖搜索算法應(yīng)用140
6.1.6連通性141
6.1.7最小生成樹(shù)算法145
6.1.8最大流算法149
6.2圖論算法應(yīng)用實(shí)例155
6.2.1蛇梯問(wèn)題155
6.2.2橋問(wèn)題157
6.2.3查找超級(jí)節(jié)點(diǎn)162
6.2.4二分圖匹配問(wèn)題165
6.2.5點(diǎn)連通度和邊連通度166
6.2.6邊不相交問(wèn)題170
6.2.7環(huán)流問(wèn)題171
6.2.8機(jī)場(chǎng)調(diào)度問(wèn)題174
6.2.9項(xiàng)目選擇問(wèn)題178
6.2.10棒球比賽問(wèn)題180
第7章攤還分析184
7.1攤還分析與漸進(jìn)分析184
7.1.1棧操作185
7.1.2二進(jìn)制計(jì)數(shù)185
7.2聚合分析186
7.2.1棧操作186
7.2.2二進(jìn)制計(jì)數(shù)186
7.2.3字典187
7.3核算法188
7.3.1棧操作188
7.3.2二進(jìn)制計(jì)數(shù)189
7.3.3動(dòng)態(tài)表189
7.3.4234樹(shù)190
7.4勢(shì)能法192
7.4.1棧操作193
7.4.2二進(jìn)制計(jì)數(shù)194
7.4.3動(dòng)態(tài)表195
7.4.4234樹(shù)195
7.4.5笛卡兒樹(shù)197
參考文獻(xiàn)201