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