本書作者根據(jù)自己20多年的教學(xué)與科研實踐,系統(tǒng)地總結(jié)了計算機算法的設(shè)計與分析方法,覆蓋了大部分主要的算法技術(shù),包括:分治法、貪心法、動態(tài)規(guī)劃、圖的遍歷技術(shù)、窮舉搜索等,涉及一系列重要的算法問題,包括排序問題、選擇問題、生成樹問題、網(wǎng)絡(luò)流問題、二分圖的匹配問題、字符串的匹配問題和幾何算法問題等,還介紹了問題本身的計算復(fù)雜性的概念和NP完全問題的理論等。
本書作者根據(jù)自己幾十年的教學(xué)與科研實踐,系統(tǒng)地總結(jié)了計算機算法的設(shè)計與分析方法,覆蓋了大部分最主要的算法技術(shù),包括分治法、貪心算法、動態(tài)規(guī)劃、圖的遍歷技術(shù)、窮舉搜索等,涉及一系列重要的算法問題,包括排序問題、選擇問題、最小生成樹問題、最短路徑問題、網(wǎng)絡(luò)流問題、二分圖的匹配問題、字符串的匹配問題和幾何算法問題等。作者力求通過有趣和難易適中的案例說明算法的特點和應(yīng)用場景,使讀者能夠理解如何針對具體問題選擇高效的算法。本書適合作為高校計算機及相關(guān)專業(yè)算法課程的教材,也適合作為軟件研發(fā)人員了解算法的技術(shù)參考書。
前 言
計算機算法是計算機科學(xué)的一個重要分支,是計算機專業(yè)的一門必修課。作者從事這門課的教學(xué)及相關(guān)研究工作已有三十余年,在走了不少彎路后逐漸領(lǐng)悟到算法的思維方法和設(shè)計技巧,積累了一些經(jīng)驗,很希望通過書的形式讓更多的讀者在學(xué)習(xí)的初期就能得到正規(guī)的訓(xùn)練,為今后進(jìn)一步深造奠定堅實的基礎(chǔ)。即使對于不再深造的學(xué)生而言,能正確地運用算法課中的方法解決實際工作中的問題也是至關(guān)重要的。我們經(jīng)常看到,有些學(xué)過算法的學(xué)生仍喜歡用自己習(xí)慣的復(fù)雜度高的方法來求解問題,這是還沒真正入門的表現(xiàn)。本書的主要目的就是幫助學(xué)生養(yǎng)成自覺運用所學(xué)方法去追求最好結(jié)果的良好習(xí)慣。
書是為學(xué)生而用,為讀者而寫。作者本著這一宗旨,以共同探索解決問題的方式來討論,使讀者能觸摸到作者的思維方法,并能建立起自己獨立思考的學(xué)習(xí)習(xí)慣。為此,作者在本書的一些地方使用了與其他書不同的敘述和證明方法,避免簡單照搬國內(nèi)外教材,以激發(fā)讀者的興趣。培養(yǎng)獨立思考能力和創(chuàng)新的欲望對從事算法工作的人來講十分重要,沒有哪一種具體的算法可以解決所有問題,也沒有哪一本書是萬能的,只有勤于思考的人才能較好地解決實際問題。理論要聯(lián)系實際,沒有理論指導(dǎo)很難把實際問題解決好,兩者的結(jié)合要靠讀者在實際工作中去實踐。
本書包含了任何算法書都會包含的基本內(nèi)容,并進(jìn)行了擴(kuò)充,主要包括網(wǎng)絡(luò)流、字符串匹配、計算幾何算法、近似算法、窮舉搜索法、平攤分析及斐波那契堆等,并在附錄中介紹了紅黑樹和用于分離集合操作的數(shù)據(jù)結(jié)構(gòu)。每章后配有精心挑選的習(xí)題,其中相當(dāng)一部分是作者在教學(xué)實踐中設(shè)計的。全書的內(nèi)容足夠用于兩個學(xué)期教學(xué)。經(jīng)過適當(dāng)?shù)厝∩,本書可用作高等院校計算機及相關(guān)專業(yè)高年級本科生、碩士生及博士生教材。
最后,作者要感謝啟蒙導(dǎo)師朱宗正教授(已去世)、博士生導(dǎo)師C. L. Liu教授(已去世) 的指導(dǎo)和熏陶,感謝清華大學(xué)、南京理工大學(xué)、伊利諾伊大學(xué)香檳分校的培養(yǎng)和提供的優(yōu)良學(xué)術(shù)環(huán)境,感謝密蘇里大學(xué)提供的教學(xué)和研究機會,感謝東南大學(xué)的單馮教授幫助完成本書的審校工作,并感謝朋友和家人的鞭策和支持。
本書修訂了第1版中的錯誤。此外,做了以下主要改進(jìn)。
增加第17章——平攤分析和斐波那契堆。
增加附錄B——用于分離集合操作的數(shù)據(jù)結(jié)構(gòu)。
在第2章、第4章和第7章中增加了一些例題和證明方法。
在第6章中,改進(jìn)了動態(tài)規(guī)劃的定義方法和例題解釋。
增加了很多難易不等的習(xí)題供教師選擇。
沈孝鈞
2024年2月20日
沈孝鈞 美國密蘇里大學(xué)榮休教授。他本科畢業(yè)于清華大學(xué),后留學(xué)美國,就讀于伊利諾大學(xué)香檳分校,師從著名計算機科學(xué)家C. L. Liu教授。獲得博士后,受聘于密蘇里大學(xué)堪薩斯分校計算機系直至退休。在30余年的教學(xué)和研究工作中,他主要講授計算機算法和離散數(shù)學(xué)。他研究的領(lǐng)域包括離散數(shù)學(xué)、幾何算法、并行處理、計算機網(wǎng)絡(luò)中的調(diào)度算法等。除會議文章外,他有數(shù)十篇論文發(fā)表在國際著名期刊上,包括SIAM Journal on Computing、Discrete Mathematics、Discrete Applied Mathematics、IEEE Journal on Selected Areas in Communications、IEEE Transactions on Networking等。
目 錄
前言
教學(xué)建議
第1章 概述 1
1.1 算法與數(shù)據(jù)結(jié)構(gòu)及程序的關(guān)系 1
1.1.1 什么是算法 1
1.1.2 算法與數(shù)據(jù)結(jié)構(gòu)的關(guān)系 1
1.1.3 算法與程序的關(guān)系 2
1.1.4 選擇排序的例子 2
1.1.5 算法的偽碼表示 2
1.2 算法復(fù)雜度分析 3
1.2.1 算法復(fù)雜度的度量 3
1.2.2 算法復(fù)雜度與輸入數(shù)據(jù)規(guī)模的關(guān)系 4
1.2.3 輸入數(shù)據(jù)規(guī)模的度量模型 4
1.2.4 算法復(fù)雜度分析中的兩個簡化假設(shè) 5
1.2.5 最好情況、最壞情況和平均情況
的復(fù)雜度分析 5
1.3 函數(shù)增長漸近性態(tài)的比較 6
1.3.1 三種比較關(guān)系及O、、記號 6
1.3.2 表示算法復(fù)雜度的常用函數(shù) 7
1.4 問題復(fù)雜度與算法復(fù)雜度的關(guān)系 9
1.4.1 問題復(fù)雜度是算法復(fù)雜度的
下界 9
1.4.2 問題復(fù)雜度與最佳算法 9
1.4.3 易處理問題和難處理問題 9
習(xí)題 10
第2章 分治法 11
2.1 分治法原理 11
2.1.1 二元搜索的例子 11
2.1.2 表示復(fù)雜度的遞推關(guān)系 12
2.2 遞推關(guān)系求解 13
2.2.1 替換法 13
2.2.2 序列求和法與遞歸樹法 15
2.2.3 常用序列和公式 16
2.2.4 主方法求解 18
2.3 例題示范 19
習(xí)題 20
第3章 基于比較的排序算法 24
3.1 插入排序 24
3.1.1 插入排序的算法 24
3.1.2 插入排序算法的復(fù)雜度分析 25
3.1.3 插入排序的優(yōu)缺點 26
3.2 合并排序 26
3.2.1 合并算法及其復(fù)雜度 26
3.2.2 合并排序的算法及其復(fù)雜度 27
3.2.3 合并排序的優(yōu)缺點 29
3.3 堆排序 30
3.3.1 堆的數(shù)據(jù)結(jié)構(gòu) 30
3.3.2 堆的修復(fù)算法及其復(fù)雜度 31
3.3.3 為輸入數(shù)據(jù)建堆 32
3.3.4 堆排序算法 33
3.3.5 堆排序算法的復(fù)雜度 34
3.3.6 堆排序算法的優(yōu)缺點 35
3.3.7 堆用作優(yōu)先隊列 35
3.4 快排序 36
3.4.1 快排序算法 36
3.4.2 快排序算法最壞情況復(fù)雜度 39
3.4.3 快排序算法平均情況復(fù)雜度 40
3.4.4 快排序算法最好情況復(fù)雜度 41
3.4.5 快排序算法的優(yōu)缺點 42
習(xí)題 42
第4章 不基于比較的排序算法 46
4.1 比較排序的下界 46
4.1.1 決策樹模型及排序最壞情況下界 46
4.1.2 二叉樹的外路徑總長與排序平均
情況下界 49
4.1.3 二叉樹的全路徑總長與堆排序
最好情況下界 51
4.2 不基于比較的線性時間排序算法 54
4.2.1 計數(shù)排序 54
4.2.2 基數(shù)排序 57
4.2.3 桶排序 58
習(xí)題 60
第5章 中位數(shù)和任一順序數(shù)的選擇 63
5.1 問題定義 63
5.2 最大數(shù)和最小數(shù)的選擇 63
5.2.1 最大和最小順序數(shù)的選擇算法及
其復(fù)雜度 64
5.2.2 同時找出最大數(shù)和最小數(shù)的
算法 65
5.3 線性時間找出任一順序數(shù)的算法 66
5.3.1 最壞情況復(fù)雜度為O(n)的算法 66
5.3.2 平均情況復(fù)雜度為O(n)的算法 68
5.4 找出k個最大順序數(shù)的算法 69
5.4.1 一個理論聯(lián)系實際的問題 69
5.4.2 利用堆來找k個最大順序數(shù)的
算法 70
5.4.3 利用錦標(biāo)賽樹來找k個最大順序數(shù)
的算法 70
習(xí)題 71
第6章 動態(tài)規(guī)劃 73
6.1 動態(tài)規(guī)劃的基本原理 73
6.2 矩陣連乘問題 75
6.2.1 定義子問題 75
6.2.2 歸納公式 77
6.2.3 算法偽碼和例子 78
6.3 最長公共子序列問題 81
6.3.1 定義子問題 81
6.3.2 歸納公式 82
6.3.3 算法偽碼和例子 82
6.4 最佳二元搜索樹問題 84
6.4.1 定義子問題和歸納公式 85
6.4.2 算法偽碼和例子 87
6.5 多級圖及其應(yīng)用 89
6.6 最長遞增子序列問題 92
6.6.1 定義子問題 93
6.6.2 歸納公式 93
6.6.3 算法偽碼和例子 93
習(xí)題 95
第7章 貪心算法 103
7.1 最佳郵局設(shè)置問題 103
7.2 一個簡單的最佳活動安排問題 105
7.3 其他最佳活動安排問題 106
7.3.1 兩個大禮堂的最佳活動安排
問題 106
7.3.2 等長時間的活動的最佳安排
問題 109
7.4 哈夫曼編碼問題 112
7.4.1 前綴碼 112
7.4.2 最佳前綴碼——哈夫曼編碼 114
7.5 最佳加油計劃問題 118
7.5.1 最佳加油計劃問題的描述 118
7.5.2 貪心算法的基本思路 119
7.5.3 貪心算法的偽碼 120
習(xí)題 121
第8章 圖的周游算法 128
8.1 圖的表示 128
8.1.1 鄰接表 129
8.1.2 鄰接矩陣 129
8.2 廣度優(yōu)先搜索及應(yīng)用 130
8.2.1 廣度優(yōu)先搜索策略 130
8.2.2 廣度優(yōu)先搜索算法及距離樹 131
8.2.3 無向圖的二著色問題 133
8.3 深度優(yōu)先搜索及應(yīng)用 136