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