黨的二十大報(bào)告指出: 教育、科技、人才是全面建設(shè)社會(huì)主義現(xiàn)代化國家的基礎(chǔ)性、戰(zhàn)略性支撐。必須堅(jiān)持科技是第一生產(chǎn)力、人才是第一資源、創(chuàng)新是第一動(dòng)力,深入實(shí)施科教興國戰(zhàn)略、人才強(qiáng)國戰(zhàn)略、創(chuàng)新驅(qū)動(dòng)發(fā)展戰(zhàn)略,這三大戰(zhàn)略共同服務(wù)于創(chuàng)新型國家的建設(shè)。高等教育與經(jīng)濟(jì)社會(huì)發(fā)展緊密相連,對促進(jìn)就業(yè)創(chuàng)業(yè)、助力經(jīng)濟(jì)社會(huì)發(fā)展、增進(jìn)人民福祉具有重要意義。
算法在計(jì)算機(jī)科學(xué)中扮演著重要角色,算法設(shè)計(jì)與分析課程是計(jì)算機(jī)科學(xué)與技術(shù)等相關(guān)專業(yè)的核心必修課,其目標(biāo)是培養(yǎng)學(xué)生分析問題和解決問題的能力,使學(xué)生掌握算法設(shè)計(jì)的基本技巧和算法分析的基本技術(shù),并能熟練運(yùn)用常用算法設(shè)計(jì)策略解決一些較綜合的問題,為學(xué)生進(jìn)一步學(xué)習(xí)后續(xù)課程奠定良好的基礎(chǔ)。本書是依據(jù)上述課程目標(biāo)并參考ACM/IEEE計(jì)算課程體系規(guī)范CC2020算法領(lǐng)域的4個(gè)績效能力(驗(yàn)證理論結(jié)果、對程序設(shè)計(jì)問題能給出解決方案、能開發(fā)出概念驗(yàn)證性程序和判斷是否能開發(fā)出更快的解決方案)所編寫的。
1.本書內(nèi)容
全書由12章構(gòu)成,各章的內(nèi)容如下:
第1章為緒論,介紹算法的概念、算法分析方法和STL在算法設(shè)計(jì)中的應(yīng)用。
第2章為遞歸算法設(shè)計(jì)技術(shù),介紹遞歸的概念、遞歸模型、遞歸算法設(shè)計(jì)方法和遞歸的經(jīng)典應(yīng)用示例,包括直接插入排序、0/1背包問題和求表達(dá)式值,以及遞推式計(jì)算方法,包括直接展開法、遞歸樹方法、主方法和特征方程方法。
第3章為窮舉法,介紹窮舉法的特點(diǎn)、各種列舉方法和窮舉法的經(jīng)典應(yīng)用示例,包括求冪集、求全排列、0/1背包問題和旅行商問題等。
第4章為分治法,介紹分治法的特點(diǎn)、分治法的基本步驟和分治法的經(jīng)典應(yīng)用示例,包括快速排序、二路歸并排序、二分查找及其擴(kuò)展、求最大連續(xù)子序列和、棋盤覆蓋問題、循環(huán)日程安排問題和旅行商問題等。
第5章為回溯法,介紹解空間概念、回溯法解空間類型、子集樹回溯算法框架、排列樹回溯算法框架和回溯法的經(jīng)典應(yīng)用示例,包括構(gòu)造表達(dá)式、圖著色問題、子集和問題、0/1背包問題、完全背包問題、n皇后問題、任務(wù)分配問題和旅行商問題等。
第6章為分支限界法,介紹廣度優(yōu)先搜索的特性、分支限界法的特點(diǎn)、分支限界法的主要類型和分支限界法的經(jīng)典應(yīng)用示例,包括圖的單源最短路徑、0/1背包問題、任務(wù)分配問題和旅行商問題等,以及A*算法的原理及其應(yīng)用。
第7章為動(dòng)態(tài)規(guī)劃,介紹動(dòng)態(tài)規(guī)劃的特點(diǎn)、動(dòng)態(tài)規(guī)劃求解問題應(yīng)具有的性質(zhì)、動(dòng)態(tài)規(guī)劃的求解步驟、滾動(dòng)數(shù)組的應(yīng)用和動(dòng)態(tài)規(guī)劃的經(jīng)典應(yīng)用示例,包括求最大連續(xù)子序列和、最長遞增子序列、三角形最小路徑和、最長公共子序列、編輯距離、0/1背包問題、完全背包問題、扔雞蛋問題、資源分配問題、旅行商問題、最少士兵數(shù)問題和矩陣連乘問題等。
第8章為貪心法,介紹貪心法的特點(diǎn)、貪心法求解問題應(yīng)具有的性質(zhì)和貪心法的經(jīng)典應(yīng)用示例,包括區(qū)間問題、背包問題、田忌賽馬問題、零錢兌換問題和哈夫曼編碼,以及擬陣的概念、帶期限和懲罰的任務(wù)調(diào)度問題的求解過程。
第9章為圖算法,討論構(gòu)造圖最小生成樹的兩種算法(Prim和Kruskal)、求圖的最短路徑的4種算法(Dijkstra、BellmanFord、SPFA和Floyd)和網(wǎng)絡(luò)流的相關(guān)概念,以及求最大流的相關(guān)算法。
第10章為計(jì)算幾何,介紹計(jì)算幾何中常用的向量運(yùn)算,以及求解凸包問題、最近點(diǎn)對問題和最遠(yuǎn)點(diǎn)對問題的典型算法。
第11章為計(jì)算復(fù)雜性,介紹易解問題和難解問題、圖靈機(jī)計(jì)算模型、P類和NP類問題以及NP完全問題。
第12章為概率算法和近似算法,介紹這兩類算法的特點(diǎn)和基本的算法設(shè)計(jì)方法。
書中帶*符號(hào)的部分作為選學(xué)內(nèi)容。
2.本書特色
本書具有如下鮮明的特色。
(1) 由淺入深,循序漸進(jìn)。每種算法設(shè)計(jì)策略從設(shè)計(jì)思想和算法框架入手,由易到難地講解相關(guān)經(jīng)典問題的求解過程,使讀者既能學(xué)到求解問題的方法,又能通過對算法設(shè)計(jì)策略的反復(fù)應(yīng)用掌握其核心原理,以收到融會(huì)貫通之效。
(2) 示例豐富,重視啟發(fā)。書中列舉大量經(jīng)典示例和有代表性的在線編程示例(選自LeetCode、LintCode、POJ和HDU),深入剖析其求解思路,展示其算法設(shè)計(jì)的清晰過程,并舉一反三,激發(fā)讀者學(xué)習(xí)算法設(shè)計(jì)的興趣。
(3) 注重求解問題的多維性。同一個(gè)問題采用多種算法策略實(shí)現(xiàn),例如0/1背包問題采用遞歸法、窮舉法、回溯法、分支限界法和動(dòng)態(tài)規(guī)劃求解,旅行商問題采用窮舉法、分治法、回溯法、分支限界法和動(dòng)態(tài)規(guī)劃求解。通過比較不同算法策略,使讀者體會(huì)每種算法策略的特點(diǎn),以提高利用不同算法策略解決復(fù)雜問題的能力。
(4) 強(qiáng)調(diào)算法實(shí)現(xiàn)和對動(dòng)手能力的培養(yǎng)。算法設(shè)計(jì)僅會(huì)紙上談兵是不夠的,必須具備從問題建模、算法設(shè)計(jì)、算法實(shí)現(xiàn)到驗(yàn)證的能力,書中精選了大量難度適中的在線編程實(shí)驗(yàn)題,通過這些題目的訓(xùn)練,不僅可以提高讀者的編程能力,還可以幫助讀者直面各類競賽和求職市場。
(5) 本書配套有《算法設(shè)計(jì)與分析(第3版)學(xué)習(xí)指導(dǎo)》和《算法設(shè)計(jì)與分析(第3版)在線編程實(shí)驗(yàn)指導(dǎo)》(李春葆等,清華大學(xué)出版社,2024),涵蓋所有練習(xí)題和在線編程題的參考答案。
3.教學(xué)資源
為了方便教師教學(xué)和學(xué)生學(xué)習(xí),本書提供了全面且豐富的教學(xué)資源,包括以下內(nèi)容。
(1) 教學(xué)PPT: 提供全部教學(xué)內(nèi)容的精美PPT課件,供任課教師在教學(xué)中使用。
(2) 程序源代碼: 所有源代碼按章組織,例如ch2文件夾中存放第2章的源代碼(在Dev C 5.11中調(diào)試通過)。
(3) 教學(xué)大綱和電子教案: 包含32和48課堂講授學(xué)時(shí)的教學(xué)內(nèi)容安排及相應(yīng)的實(shí)驗(yàn)教學(xué)內(nèi)容安排,供教師參考。
(4) 與各章知識(shí)點(diǎn)對應(yīng)的題庫: 包括單項(xiàng)選擇題、填空題和算法設(shè)計(jì)的上機(jī)實(shí)驗(yàn)題。
(5) 絕大部分知識(shí)點(diǎn)的教學(xué)視頻: 視頻采用微課碎片化形式組織,含170個(gè)視頻,累計(jì)超過34小時(shí)。
資源下載提示
課件等資源: 掃描封底的課件下載二維碼,在公眾號(hào)書圈下載。
素材(源碼)等資源: 掃描目錄上方的二維碼下載。
在線自測題: 掃描封底的作業(yè)系統(tǒng)二維碼,再掃描自測題二維碼在線做題。
微課視頻: 掃描封底的文泉云盤防盜碼,再掃描書中相應(yīng)章節(jié)的視頻講解二維碼,可以在線學(xué)習(xí)。
4.致謝
本書的編寫得到101計(jì)劃和武漢大學(xué)計(jì)算機(jī)學(xué)院相關(guān)課程教學(xué)研究項(xiàng)目的大力支持,清華大學(xué)出版社的魏江江分社長和王冰飛老師提供了全方位的幫助和精心的編輯工作,LeetCode和相關(guān)在線編程平臺(tái)給予了無私的幫助,編者在此一并表示衷心的感謝。
盡管編者不遺余力,但由于水平所限,本書仍存在疏漏和不足之處,敬請教師和同學(xué)們批評指正。
編者
2024年1月
掃一掃
源碼下載
第1章緒論/
1.1算法概述/
1.1.1什么是算法/
1.1.2算法描述/
1.1.3算法設(shè)計(jì)的基本步驟/
1.2算法分析/
1.2.1算法時(shí)間復(fù)雜度分析/
1.2.2算法空間復(fù)雜度分析/
1.3算法設(shè)計(jì)工具STL/
1.3.1STL概述/
1.3.2vector(向量容器)/
1.3.3string(字符串容器)/
1.3.4deque(雙端隊(duì)列容器)/
1.3.5list(鏈表容器)/
1.3.6stack(棧容器)/
1.3.7queue(隊(duì)列容器)/
1.3.8priority_queue(優(yōu)先隊(duì)列容器)/
1.3.9set(集合容器)/multiset(多重集合容器)/
1.3.10map(映射容器)/multimap(多重映射容器)/
1.3.11unordered_set(哈希集合容器)/
1.3.12unordered_map(哈希映射容器)/
1.4練習(xí)題/
1.5在線編程實(shí)驗(yàn)題/
第2章遞歸算法設(shè)計(jì)技術(shù)/
2.1遞歸概述/
2.1.1什么是遞歸/
2.1.2何時(shí)使用遞歸/
2.1.3遞歸模型/
2.1.4遞歸算法的執(zhí)行過程/
2.1.5遞歸算法的時(shí)間復(fù)雜度和空間復(fù)雜度分析/
2.2遞歸算法的設(shè)計(jì)方法/
2.2.1遞歸與數(shù)學(xué)歸納法/
2.2.2遞歸算法設(shè)計(jì)的一般步驟/
2.2.3基于遞歸數(shù)據(jù)結(jié)構(gòu)的遞歸算法設(shè)計(jì)/
2.2.4基于歸納思想的遞歸算法設(shè)計(jì)/
2.3直接插入排序/
2.40/1背包問題/
2.5求表達(dá)式的值/
2.6計(jì)算遞推式/
2.6.1直接展開法/
2.6.2遞歸樹方法/
2.6.3主方法/
2.6.4*特征方程方法/
2.7練習(xí)題/
2.8在線編程實(shí)驗(yàn)題/
第3章窮舉法/
3.1窮舉法概述/
3.1.1什么是窮舉法/
3.1.2窮舉算法的框架/
3.2算法優(yōu)化中常用的數(shù)據(jù)結(jié)構(gòu)/
3.2.1前綴和數(shù)組/
3.2.2并查集/
3.3求回文串的個(gè)數(shù)/
3.4求最大連續(xù)子序列和/
3.5求冪集/
3.60/1背包問題/
3.7求全排列/
3.8n皇后問題/
3.9任務(wù)分配問題/
3.10旅行商問題/
3.11練習(xí)題/
3.12在線編程實(shí)驗(yàn)題/
第4章分治法/
4.1分治法概述/
4.1.1什么是分治法/
4.1.2分治法的求解過程/
4.1.3分治算法分析/
4.2快速排序/
4.3二路歸并排序/
4.4二分查找/
4.4.1基本二分查找/
4.4.2二分查找的擴(kuò)展/
4.5求最大連續(xù)子序列和/
4.6棋盤覆蓋問題/
4.7循環(huán)日程安排問題/
4.8旅行商問題/
4.9練習(xí)題/
4.10在線編程實(shí)驗(yàn)題/
第5章回溯法/
5.1回溯法概述/
5.1.1問題的解空間/
5.1.2什么是回溯法/
5.1.3回溯算法分析/
5.2基于子集樹的回溯算法框架/
5.2.1解空間樹的類型/
5.2.2求冪集/
5.2.3子集樹回溯算法框架/
5.3圖的路徑搜索/
5.4構(gòu)造表達(dá)式/
5.5圖的m著色問題/
5.6子集和問題/
5.7簡單裝載問題/
5.80/1背包問題/
5.9*完全背包問題/
5.10基于排列樹的回溯算法框架/
5.10.1求全排列/
5.10.2排列樹回溯算法框架/
5.11n皇后問題/
5.12任務(wù)分配問題/
5.13旅行商問題/
5.14練習(xí)題/
5.15在線編程實(shí)驗(yàn)題/
第6章分支限界法/
6.1分支限界法概述/
6.1.1什么是分支限界法/
6.1.2分支限界法的設(shè)計(jì)要點(diǎn)/
6.1.3分支限界法的時(shí)間性能/
6.2廣度優(yōu)先搜索/
6.2.1圖的廣度優(yōu)先搜索/
6.2.2廣度優(yōu)先搜索的應(yīng)用/
6.3隊(duì)列式分支限界法的框架/
6.4圖的單源最短路徑/
6.50/1背包問題(1)/
6.6優(yōu)先隊(duì)列式分支限界法的框架/
6.70/1背包問題(2)/
6.8任務(wù)分配問題/
6.9旅行商問題/
6.10*A*算法及其應(yīng)用/
6.10.1A*算法概述/
6.10.2啟發(fā)式函數(shù)/
6.11練習(xí)題/
6.12在線編程實(shí)驗(yàn)題/
第7章動(dòng)態(tài)規(guī)劃/
7.1動(dòng)態(tài)規(guī)劃概述/
7.1.1從一個(gè)簡單的示例入門/
7.1.2動(dòng)態(tài)規(guī)劃的原理/
7.1.3動(dòng)態(tài)規(guī)劃求解問題的類型、性質(zhì)和步驟/
7.1.4動(dòng)態(tài)規(guī)劃與其他方法的比較/
7.2求最大連續(xù)子序列和/
7.3最長遞增子序列/
7.4三角形的最小路徑和/
7.5最長公共子序列/
7.6編輯距離/
7.70/1背包問題/
7.8*完全背包問題和多重背包問題/
7.8.1完全背包問題/
7.8.2多重背包問題/
7.9扔雞蛋問題/
7.10資源分配問題/
7.11旅行商問題/
7.12最少士兵數(shù)問題/
7.13矩陣連乘問題/
7.14練習(xí)題/
7.15在線編程實(shí)驗(yàn)題/
第8章貪心法/
8.1貪心法概述/
8.1.1什么是貪心法/
8.1.2用貪心法求解的問題具有的性質(zhì)/
8.1.3用貪心法求解問題的一般過程/
8.2區(qū)間問題/
8.2.1最大兼容區(qū)間個(gè)數(shù)/
8.2.2區(qū)間合并/
8.2.3*最少資源問題/
8.3背包問題/
8.4田忌賽馬問題/
8.5零錢兌換問題/
8.6哈夫曼編碼/
8.7*擬陣/
8.7.1擬陣概述/
8.7.2求加權(quán)擬陣最優(yōu)子集的貪心算法/
8.7.3帶期限和懲罰的任務(wù)調(diào)度問題/
8.8練習(xí)題/
8.9在線編程實(shí)驗(yàn)題/
第9章圖算法/
9.1圖的最小生成樹/
9.1.1什么是最小生成樹/
9.1.2Prim算法/
9.1.3Kruskal算法/
9.2圖的最短路徑/
9.2.1Dijkstra算法/
9.2.2BellmanFord算法/
9.2.3SPFA算法/
9.2.4Floyd算法/
9.3網(wǎng)絡(luò)流/
9.3.1問題的引入/
9.3.2FordFulkerson算法/
9.3.3EdmondsKrap算法/
9.3.4Dinic算法/
9.4練習(xí)題/
9.5在線編程實(shí)驗(yàn)題/
第10章計(jì)算幾何/
10.1向量運(yùn)算/
10.1.1向量的基本運(yùn)算/
10.1.2判斷點(diǎn)是否在矩形內(nèi)/
10.1.3判斷點(diǎn)是否在線段上/
10.1.4判斷兩條線段是否平行/
10.1.5判斷兩條線段是否相交/
10.1.6判斷點(diǎn)是否在多邊形內(nèi)/
10.1.7求3個(gè)點(diǎn)構(gòu)成的三角形的面積/
10.1.8求多邊形的面積/
10.2凸包問題/
10.2.1禮品包裹算法/
10.2.2Graham算法/
10.3最近點(diǎn)對問題/
10.3.1用窮舉法求最近點(diǎn)對/
10.3.2用分治法求最近點(diǎn)對/
10.4最遠(yuǎn)點(diǎn)對問題/
10.4.1用窮舉法求最遠(yuǎn)點(diǎn)對/
10.4.2用旋轉(zhuǎn)卡殼法求最遠(yuǎn)點(diǎn)對/
10.5練習(xí)題/
10.6在線編程實(shí)驗(yàn)題/
第11章計(jì)算復(fù)雜性/
11.1P類和NP類/
11.1.1易解問題和難解問題/
11.1.2判定問題和優(yōu)化問題/
11.1.3計(jì)算模型/
11.1.4P類問題/
11.1.5NP類問題/
11.2多項(xiàng)式時(shí)間變換和問題歸約/
11.3NP完全問題/
11.3.1什么是NP完全問題和NP難問題/
11.3.2第一個(gè)NP完全問題/
11.3.3其他NP完全問題/
11.4練習(xí)題/
第12章概率算法和近似算法/
12.1概率算法/
12.1.1什么是概率算法/
12.1.2數(shù)值概率算法/
12.1.3蒙特卡洛算法/
12.1.4拉斯維加斯算法/
12.1.5舍伍德算法/
12.2近似算法/
12.2.1什么是近似算法/
12.2.2多機(jī)調(diào)度問題的近似算法/
12.2.30/1背包問題的近似算法/
12.2.4旅行商問題的近似算法/
12.3練習(xí)題/
參考文獻(xiàn)/