本書遵循“精選案例,面向設(shè)計(jì),深入淺出,注重能力培養(yǎng)”的要求,以案例形式實(shí)現(xiàn)算法與程序設(shè)計(jì)教學(xué),精選了窮舉法、遞推法、回溯法、分支限界法、遞歸法、分治法、貪心算法、動(dòng)態(tài)規(guī)劃法和隨機(jī)算法等常用算法進(jìn)行講解,并給出了使用各算法求解的典型案例。對(duì)于每一個(gè)案例的求解,從問(wèn)題提出到算法設(shè)計(jì)、從程序?qū)崿F(xiàn)到算法復(fù)雜度分析,環(huán)環(huán)相扣,融為一體,力求理論與實(shí)際相結(jié)合、算法與程序相統(tǒng)一,突出算法在解決實(shí)際問(wèn)題中的核心地位與引導(dǎo)作用。本書中的所有案例均給出算法設(shè)計(jì)要點(diǎn)與完整的C語(yǔ)言或者C++語(yǔ)言程序代碼(均在VC++ 6.0上編譯通過(guò))。為方便教學(xué),每章都附有習(xí)題,同時(shí)提供教學(xué)課件、習(xí)題答案、源代碼等配套資源,讀者可登錄華信教育資源網(wǎng)(www.hxedu.com.cn)免費(fèi)下載使用。本書既可作為高等院校計(jì)算機(jī)專業(yè)相關(guān)課程的教材,也可供IT從業(yè)人員和計(jì)算機(jī)編程愛(ài)好者參考使用。
楊建英,碩士畢業(yè)于華南師范大學(xué)人工智能與模糊識(shí)別專業(yè),目前在山西大學(xué)軟件學(xué)院任教。山西CCF大會(huì)分會(huì)委員,山西大學(xué)計(jì)算機(jī)協(xié)會(huì)指導(dǎo)教師,山西大學(xué)軟件應(yīng)用協(xié)會(huì)指導(dǎo)教師,山西大學(xué)ACM-ICPC算法隊(duì)指導(dǎo)老師,山西大學(xué)精英之英競(jìng)賽與科技創(chuàng)新團(tuán)隊(duì)指導(dǎo)老師。 參與多個(gè)國(guó)家自然科學(xué)基金青年基金項(xiàng)目,榮獲山西省科技進(jìn)步三等獎(jiǎng),“數(shù)據(jù)庫(kù)原理與應(yīng)用”獲得山西省精品資源共享課程,出版《Vue.js企業(yè)開發(fā)實(shí)戰(zhàn)》《Python快樂(lè)編程數(shù)據(jù)分析與實(shí)戰(zhàn)》《C語(yǔ)言教程與等級(jí)考試》等多部圖書。
第1章 算法與程序設(shè)計(jì)簡(jiǎn)介 1
1.1 初識(shí)算法 1
1.1.1 算法的基本概念 2
1.1.2 算法的描述 4
1.1.3 算法設(shè)計(jì)的步驟 7
1.1.4 算法的分類 8
1.2 算法復(fù)雜度分析 9
1.2.1 時(shí)間復(fù)雜度 9
1.2.2 空間復(fù)雜度 14
1.2.3 算法設(shè)計(jì)實(shí)例 15
1.3 程序設(shè)計(jì)簡(jiǎn)介 17
1.3.1 算法與程序 18
1.3.2 結(jié)構(gòu)化程序設(shè)計(jì) 19
1.3.3 結(jié)構(gòu)化程序設(shè)計(jì)實(shí)例 20
習(xí)題 21
第2章 窮舉法 23
2.1 窮舉法概述 23
2.1.1 窮舉法的基本思想 23
2.1.2 窮舉法的實(shí)施步驟與算法描述 23
2.2 整數(shù)搜索 25
2.2.1 算24點(diǎn)游戲 25
2.2.2 韓信點(diǎn)兵 27
2.2.3 素?cái)?shù)問(wèn)題 28
2.2.4 約瑟夫環(huán)問(wèn)題 29
2.2.5 火柴棒等式 30
2.2.6 三色旗問(wèn)題 31
2.2.7 勾股數(shù)問(wèn)題 32
2.2.8 猜價(jià)格游戲 33
2.3 分解與重組 35
2.3.1 水仙花數(shù) 35
2.3.2 回文數(shù) 35
2.3.3 完數(shù) 36
2.4 趣味數(shù)學(xué) 37
2.4.1 百錢買百雞問(wèn)題 37
2.4.2 搬磚問(wèn)題 38
2.4.3 雞兔同籠問(wèn)題 38
2.4.4 數(shù)學(xué)燈謎 39
2.5 解方程與不等式 40
2.5.1 解二元一次方程 40
2.5.2 解完美立方式 40
2.5.3 解一元二次不等式 41
2.6 數(shù)陣與圖形 42
2.6.1 楊輝三角形 42
2.6.2 輸出各種圖形 43
2.7 窮舉設(shè)計(jì)的優(yōu)化 45
習(xí)題 47
第3章 遞推法 48
3.1 遞推法概述 48
3.1.1 遞推法的基本思想 48
3.1.2 遞推法的實(shí)施步驟與算法描述 49
3.2 遞推數(shù)列 51
3.2.1 斐波那契數(shù)列和盧卡斯數(shù)列 51
3.2.2 分?jǐn)?shù)數(shù)列 53
3.2.3 冪序列 53
3.2.4 雙關(guān)系遞推數(shù)列 54
3.2.5 儲(chǔ)油點(diǎn)問(wèn)題 56
3.3 遞推數(shù)陣 57
3.3.1 累加和 57
3.3.2 階乘問(wèn)題 58
3.3.3 九九乘法表 58
3.4 遞推的其他應(yīng)用 59
3.4.1 猴子爬山問(wèn)題 59
3.4.2 整幣兌零問(wèn)題 60
3.4.3 整數(shù)劃分問(wèn)題 61
3.4.4 漢諾塔問(wèn)題 61
3.4.5 體重指數(shù)BMI 62
3.4.6 求π的近似值 63
3.4.7 求一元二次方程的根 63
3.4.8 求三角形的面積 64
3.4.9 存錢問(wèn)題 65
3.4.10 求最大公約數(shù)和最小公倍數(shù) 66
習(xí)題 67
第4章 回溯法 68
4.1 回溯法概述 68
4.1.1 回溯法的基本思想 68
4.1.2 回溯法的實(shí)施步驟和算法描述 69
4.2 回溯法的應(yīng)用 70
4.2.1 八皇后問(wèn)題 70
4.2.2 圖的著色問(wèn)題 71
4.2.3 裝載問(wèn)題 73
4.2.4 批處理作業(yè)調(diào)度 75
4.2.5 符號(hào)三角形問(wèn)題 77
4.2.6 最大團(tuán)問(wèn)題 78
4.2.7 旅行售貨員問(wèn)題 80
4.2.8 電路板排列問(wèn)題 82
4.2.9 連續(xù)郵資問(wèn)題 84
4.2.10 圓排列問(wèn)題 86
4.2.11 橋本分?jǐn)?shù)式 88
4.2.12 素?cái)?shù)環(huán) 89
4.2.13 神奇古尺 91
4.3 回溯設(shè)計(jì)的優(yōu)化 92
習(xí)題 93
第5章 分支限界法 94
5.1 分支限界法概述 94
5.1.1 分支限界法的基本思想 94
5.1.2 分支限界法的實(shí)施步驟和算法描述 94
5.2 分支限界法的應(yīng)用 95
5.2.1 迷宮問(wèn)題 95
5.2.2 六數(shù)碼問(wèn)題 98
5.2.3 旅行商問(wèn)題 101
5.2.4 背包問(wèn)題 104
5.3 回溯法與分支限界法的比較 108
習(xí)題 109
第6章 遞歸法 110
6.1 遞歸法概述 110
6.1.1 遞歸法的基本思想 110
6.1.2 遞歸法的實(shí)施步驟和算法描述 110
6.2 遞歸法的應(yīng)用 111
6.2.1 整數(shù)劃分問(wèn)題 111
6.2.2 漢諾塔問(wèn)題 112
6.2.3 枚舉排列問(wèn)題 113
6.2.4 用遞歸法求斐波那契數(shù)列 114
6.2.5 排隊(duì)買票問(wèn)題 115
6.2.6 猴子吃桃子問(wèn)題 116
6.2.7 RPG涂色問(wèn)題 117
6.2.8 二叉樹的遍歷 118
6.3 回溯法與遞歸法的比較 120
習(xí)題 120
第7章 分治法 121
7.1 分治法概述 121
7.1.1 分治法的基本思想 121
7.1.2 分治法的實(shí)施步驟和算法描述 122
7.2 分治法的應(yīng)用 123
7.2.1 二分查找法 123
7.2.2 大整數(shù)乘法 125
7.2.3 斯特拉森矩陣乘法 127
7.2.4 棋盤覆蓋問(wèn)題 128
7.2.5 合并排序 129
7.2.6 快速排序 132
7.2.7 線性時(shí)間選擇 133
7.2.8 最近點(diǎn)對(duì)問(wèn)題 136
7.2.9 循環(huán)賽日程表 137
7.3 遞歸轉(zhuǎn)化 139
7.3.1 一般的遞歸轉(zhuǎn)非遞歸 139
7.3.2 分治法中的遞歸轉(zhuǎn)化 141
習(xí)題 143
第8章 貪心算法 145
8.1 貪心算法概述 145
8.1.1 貪心算法的基本思想 145
8.1.2 貪心算法的實(shí)施步驟與算法描述 145
8.2 活動(dòng)安排問(wèn)題 146
8.3 田忌賽馬 148
8.4 背包問(wèn)題 149
8.5 覆蓋問(wèn)題 151
8.5.1 區(qū)間覆蓋問(wèn)題 151
8.5.2 最大不相交覆蓋 151
8.5.3 點(diǎn)覆蓋 151
8.6 教室調(diào)度問(wèn)題 153
8.7 最小生成樹——Kruskal算法 155
8.8 最小生成樹——Prim算法 157
8.9 哈夫曼編碼 160
8.10 教室分配問(wèn)題 164
8.11 最短路徑——弗洛伊德算法 166
8.12 最短路徑——迪杰斯德拉算法 169
8.13 均分紙牌 172
8.14 最佳瀏覽路線問(wèn)題 173
8.15 機(jī)器調(diào)度問(wèn)題 175
8.16 錢幣找零問(wèn)題 176
習(xí)題 177
第9章 動(dòng)態(tài)規(guī)劃法 178
9.1 動(dòng)態(tài)規(guī)劃法概述 178
9.1.1 動(dòng)態(tài)規(guī)劃法的基本思想 178
9.1.2 動(dòng)態(tài)規(guī)劃法的實(shí)施步驟與算法描述 179
9.2 裝載問(wèn)題 180
9.3 投資分配問(wèn)題 181
9.4 背包問(wèn)題 185
9.4.1 0-1背包問(wèn)題 185
9.4.2 二維0-1背包問(wèn)題 187
9.5 最長(zhǎng)子序列探索 188
9.5.1 最長(zhǎng)非降子序列 188
9.5.2 最長(zhǎng)公共子序列(Longest Common Subsequence,LCS) 190
9.6 最優(yōu)路徑搜索 192
9.6.1 數(shù)字三角形最大路徑和 192
9.6.2 多源最短路徑問(wèn)題 194
9.6.3 走方格問(wèn)題 197
9.6.4 郵資問(wèn)題 198
9.7 動(dòng)態(tài)規(guī)劃與其他算法的比較 199
習(xí)題 200
第10章 隨機(jī)算法 201
10.1 隨機(jī)算法概述 201
10.2 隨機(jī)數(shù) 201
10.2.1 隨機(jī)生成數(shù)組元素 202
10.2.2 隨機(jī)生成數(shù)字 204
10.2.3 隨機(jī)生成計(jì)算題 206
10.3 同余算法 208
10.4 舍伍德算法 209
10.5 蒙特卡羅算法 211
10.5.1 用蒙特卡羅算法求π的值 211
10.5.2 用蒙特卡羅算法求特殊圖形的面積 212
10.5.3 蒙特卡羅算法的優(yōu)缺點(diǎn)及改進(jìn)措施 213
10.6 拉斯維加斯算法 214
10.7 蒙特卡羅算法和拉斯維加斯算法的比較 217
10.8 隨機(jī)算法的優(yōu)缺點(diǎn) 217
習(xí)題 217
附錄A 不同算法的比較 219
參考文獻(xiàn) 221