黨的二十大報(bào)告指出: 教育、科技、人才是全面建設(shè)社會(huì)主義現(xiàn)代化國(guó)家的基礎(chǔ)性、戰(zhàn)略性支撐。必須堅(jiān)持科技是第一生產(chǎn)力、人才是第一資源、創(chuàng)新是第一動(dòng)力,深入實(shí)施科教興國(guó)戰(zhàn)略、人才強(qiáng)國(guó)戰(zhàn)略、創(chuàng)新驅(qū)動(dòng)發(fā)展戰(zhàn)略,這三大戰(zhàn)略共同服務(wù)于創(chuàng)新型國(guó)家的建設(shè)。高等教育與經(jīng)濟(jì)社會(huì)發(fā)展緊密相連,對(duì)促進(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è)績(jī)效能力(驗(yàn)證理論結(jié)果、對(duì)程序設(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ù)子序列和、最長(zhǎng)遞增子序列、三角形最小路徑和、最長(zhǎng)公共子序列、編輯距離、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)對(duì)問題和最遠(yuǎn)點(diǎn)對(duì)問題的典型算法。
第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é)到求解問題的方法,又能通過對(duì)算法設(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)和對(duì)動(dòng)手能力的培養(yǎng)。算法設(shè)計(jì)僅會(huì)紙上談兵是不夠的,必須具備從問題建模、算法設(shè)計(jì)、算法實(shí)現(xiàn)到驗(yàn)證的能力,書中精選了大量難度適中的在線編程實(shí)驗(yàn)題,通過這些題目的訓(xùn)練,不僅可以提高讀者的編程能力,還可以幫助讀者直面各類競(jìng)賽和求職市場(chǎng)。
(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)對(duì)應(yīng)的題庫(kù): 包括單項(xiàng)選擇題、填空題和算法設(shè)計(jì)的上機(jī)實(shí)驗(yàn)題。
(5) 絕大部分知識(shí)點(diǎn)的教學(xué)視頻: 視頻采用微課碎片化形式組織,含170個(gè)視頻,累計(jì)超過34小時(shí)。
資源下載提示
課件等資源: 掃描封底的課件下載二維碼,在公眾號(hào)書圈下載。
素材(源碼)等資源: 掃描目錄上方的二維碼下載。
在線自測(cè)題: 掃描封底的作業(yè)系統(tǒng)二維碼,再掃描自測(cè)題二維碼在線做題。
微課視頻: 掃描封底的文泉云盤防盜碼,再掃描書中相應(yīng)章節(jié)的視頻講解二維碼,可以在線學(xué)習(xí)。
4.致謝
本書的編寫得到101計(jì)劃和武漢大學(xué)計(jì)算機(jī)學(xué)院相關(guān)課程教學(xué)研究項(xiàng)目的大力支持,清華大學(xué)出版社的魏江江分社長(zhǎng)和王冰飛老師提供了全方位的幫助和精心的編輯工作,LeetCode和相關(guān)在線編程平臺(tái)給予了無私的幫助,編者在此一并表示衷心的感謝。
盡管編者不遺余力,但由于水平所限,本書仍存在疏漏和不足之處,敬請(qǐng)教師和同學(xué)們批評(píng)指正。
編者
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簡(jiǎn)單裝載問題/
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è)簡(jiǎn)單的示例入門/
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最長(zhǎng)遞增子序列/
7.4三角形的最小路徑和/
7.5最長(zhǎng)公共子序列/
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)對(duì)問題/
10.3.1用窮舉法求最近點(diǎn)對(duì)/
10.3.2用分治法求最近點(diǎn)對(duì)/
10.4最遠(yuǎn)點(diǎn)對(duì)問題/
10.4.1用窮舉法求最遠(yuǎn)點(diǎn)對(duì)/
10.4.2用旋轉(zhuǎn)卡殼法求最遠(yuǎn)點(diǎn)對(duì)/
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)/