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