呂國英、李茹、王文劍、任瑞征、錢宇華編著的 《算法設計與分析(第3版)》的內容遵循《高等學 校計算機科學與技術專業公共核心知識體系與課程》 (教育部高等學校計算機科學與技術教學指導委員會 ,2008)的知識體系,介紹算法及其設計、分析的基 礎知識,并通過大量例題,講解枚舉法、遞推法、分 治法、貪婪算法、動態規劃及與圖搜索有關的算法策 略。除此之外,還對算法設計基本工具的使用和算法 設計中的技巧做了講解。最后通過案例的一題多解進 行算法設計的實踐。算法采用了接近自然語言(英語 )的符號,可讀性強,適合于不同程序設計語言背景 的讀者學習。
本書可以作為高等院校計算機及其相關專業高年 級本科生和研究生算法設計課程的教材,也可作為計 算機工作者、廣大程序設計愛好者和信息學愛好者的 參考書。
進入21世紀,各國高科技發展突飛猛進,對教育資源、人才資源的爭奪也日益激烈,計算機軟件開發人才更是處于核心競爭地位。培養應用型軟件開發人才成為提高國家科技實力的重要步驟。國家973信息技術與高性能軟件基礎規劃項目首席科學家顧鈞教授和中國工程院院士李國杰教授指出: “我國的軟件開發要算法先行,這樣才能推動軟件技術的研究與開發,提高我國企業軟件產品的技術競爭力和市場競爭力。”
“算法設計與分析”是一門理論性與實踐性相結合的課程,是計算機科學與計算機應用專業的核心課程。學習算法設計可以在分析解決問題的過程中,培養學生抽象思維和縝密概括的能力,提高學生的軟件開發設計能力。
全書共包含四篇:
1. 第1篇“引入篇”共兩章,從認識算法開始,介紹問題求解的步驟及算法在其中的重要地位,講解了算法效率分析的基本方法,對當前常用的算法軟件進行了簡要概述(此節可作為選修)。
2. 第2篇“基礎篇”,對算法的重復操作機制——循環和遞歸的設計要點、算法中數據結構的選擇和提高算法效率的基本技巧做了講解,這些都是算法設計的重要基礎。
3. 第3篇“核心篇”共兩章,主要介紹了幾種常用的算法策略,如: 枚舉法、遞推法、分治法、貪婪算法、動態規劃及與圖搜索有關的算法策略,并對算法策略進行了總結比較。
4. 第4篇“應用篇”共兩章,第6章通過隨機序列改進前面介紹的算法效率,介紹概率經典算法(第3版新增內容)。第7章以問題為節,每節中針對同一問題給出采用不同的數學模型、不同數據結構或不同的算法策略進行算法設計,并進行效率分析。這部分內容是對算法設計學習的實踐。
本教材建設的理念是“實用、適用”。書中的例題選擇力求簡單但具有代表性,從分析問題開始,經模型建立,再進行算法設計(包括數據結構設計)和算法分析。這樣做有利于培養學生“設計”算法的能力,而不是“記憶” 算法的能力。并力爭淺顯易懂地講解較深奧的算法設計策略和算法分析方法。
本書的主要特點有:
1) 重系統性
教材的第3篇“核心篇”摒棄同類教材中根據問題劃分章節的方法,通過對算法策略特點的概括和歸納,以同一策略下的應用差別來劃分章節,使得教材結構更合理、講解更系統,更加符合認知規律。同時,在各章末尾對算法進行比較、總結,使學生能方便、全面地掌握算法策略的本質及算法應用體系。
2) 重啟發性
本書中例題都是經過問題分析、數學建模、數據結構設計后,才給出算法設計和算法分析的。這樣講解富有啟發性,不僅培養了學生算法設計的思維方式,還能改變學生被動接受知識的習慣,養成主動學習的意識, 進而提高創新能力。
3) 重適用性
第2篇“基礎篇”是從程序設計到算法設計承上啟下的內容,對問題求解的基本方法、算法基本工具的使用及提高算法效率的基本技巧做了必要的總結、歸納。相信這些內容會對普通院校的廣大學生有較大的裨益,促進其打好學習算法設計的基礎。彌補了以往教材缺乏課程間銜接內容的缺陷,可以增強學生學習該課程的自信心,提高教學效率。
4) 重開放性
教材在第1篇中對現代算法進行了概覽,旨在擴大學生的知識面,提高其對算法設計的學習興趣。教材還獨特地介紹了從算法到程序轉換的要點,引導學生不是僅僅停留在形式化的算法描述階段,而是大膽上機實現,提高學生學習本學科的興趣。
5) 重實踐性
第4篇“應用篇”是本教材的一大亮點。該篇以問題為節,每節針對同一問題采用不同的數學模型、不同的數據結構或不同的算法策略進行算法設計,擴展學生解決問題的思路,學會靈活運用算法知識,而不是生搬硬套教材中的算法。同時,也可以通過對多種算法設計的分析比較認識算法的優劣,從而設計出質量優良的算法。
在學習算法設計的過程中,有的讀者一定會感到所學的內容和大多例題都離現實問題較遠,似乎用途不大。這是因為現實中的實際問題往往比較復雜,需要具備豐富的領域知識、算法設計方法和技巧規范及軟件工程的開發規范等綜合技能。所以,只能通過一些簡單、抽象的例子,對基礎的算法策略進行講解。待打好算法設計基礎且有足夠的問題領域知識儲備后,才能去解決實際應用問題。附錄“算法設計與分析課程設計大綱”中給出一些與現實結合相對較緊的練習,區別于章節習題,希望讀者廣開思路,應用所學知識解決問題。
《算法設計與分析》自2006年第1版出版以來,受到讀者的廣泛好評,多所院校將本書作為“算法設計與分析”課程的教材,在此,我們對讀者表示由衷的感謝!同時,我們深感重任在身,在聽取廣大讀者提出的寶貴意見的基礎上,極為慎重地對待本次改版工作。教材的出版凝聚了出版社工作人員的辛勤汗水,在此感謝出版社領導與編輯們的信任與付出。
隨著信息化時代的到來,計算機開發平臺日新月異,計算機的應用也不斷拓展到了各個領域; 各類算法和技巧層出不窮,本書只能是管中窺豹。若能達到本書的初衷——使讀者能掌握算法設計的基本方法和技巧,打好軟件開發的基礎,我們就深感滿意了。
由于作者水平有限,書中不當之處敬請專家和讀者指正。
作者2014年10月
第1篇 引入篇
第1章 算法概述
1.1 用計算機求解問題與算法
1.1.1 用計算機求解問題的步驟
1.1.2 算法及其要素和特性
1.1.3 算法設計及基本方法
1.1.4 從算法到實現
1.2 算法設計步驟及描述
1.2.1 算法描述簡介
1.2.2 本書算法描述約定
1.2.3 一個簡單問題的求解過程
1.3 現代常用算法概覽
1.3.1 壓縮算法
1.3.2 加密算法
1.3.3 人工智能算法
1.3.4 并行算法
1.3.5 其他實用算法
第2章 算法分析基礎
2.1 算法分析體系及計量
2.1.1 算法分析的評價體系
2.1.2 算法的時間復雜性
2.1.3 算法的空間復雜性
2.1.4 NP完全問題
2.2 算法分析實例
2.2.1 非遞歸算法分析
2.2.2 遞歸算法分析
2.2.3 提高算法質量
第2篇 基礎篇
第3章 算法基本工具和優化技巧
3.1 循環與遞歸
3.1.1 循環設計要點
3.1.2 遞歸設計要點
3.1.3 遞歸與循環的比較
3.2 算法與數據結構
3.2.1 原始信息與處理結果的對應存儲
3.2.2 數組使信息有序化
3.2.3 數組記錄狀態信息
3.2.4 大整數存儲及運算
3.2.5 構造趣味矩陣
3.2.6 一維與二維的選擇
3.3 優化算法的基本技巧
3.3.1 算術運算的妙用
3.3.2 標志量的妙用
3.3.3 信息數字化
3.4 優化算法的數學模型
3.4.1 楊輝三角形的應用
3.4.2 最大公約數的應用
3.4.3 公倍數的應用
3.4.4 斐波那契數列的應用
3.4.5 特征根求解遞推方程
習題
第3篇 核心篇
第4章 基本的算法策略
4.1 迭代算法
4.1.1 遞推法
4.1.2 倒推法
4.1.3 迭代法解方程
4.2 蠻力法
4.2.1 枚舉法
4.2.2 其他范例
4.3 分而治之算法
4.3.1 分治算法框架
4.3.2 典型二分法
4.3.3 二分法不相似情況
4.3.4 二分法不獨立情況
4.3.5 非等分分治
4.4 貪婪算法
4.4.1 可絕對貪婪問題
4.4.2 相對或近似貪婪問題
4.4.3 貪婪策略算法設計框架
4.5 動態規劃
4.5.1 認識動態規劃
4.5.2 動態規劃算法設計框架
4.5.3 突出階段性的動態規劃應用
4.5.4 突出遞推的動態規劃應用
4.6 算法策略間的比較
4.6.1 不同算法策略特點小結
4.6.2 算法策略間的關聯
4.6.3 算法策略側重的問題類型
習題
第5章 圖的搜索算法
5.1 圖搜索概述
5.1.1 圖及其術語
5.1.2 圖搜索及其術語
5.2 廣度優先搜索
5.2.1 算法框架
5.2.2 廣度優先搜索的應用
5.3 深度優先搜索
5.3.1 算法框架
5.3.2 深度優先搜索的應用
5.4 回溯法
5.4.1 認識回溯法
5.4.2 算法簡介算法框架
5.4.3 應用1——基本的回溯搜索
5.4.4 應用2——排列及排列樹的回溯搜索
5.4.5 應用3——最優化問題的回溯搜索
5.5 分支限界法
5.5.1 分支搜索算法
5.5.2 分支一限界搜索算法
5.5.3 算法框架
5.6 圖的搜索算法小結
習題
第4篇 應用篇
第6章 概率算法
6.1 概述
6.2 統計模擬——蒙特卡羅算法
6.2.1 數值計算方法——蒙特卡羅算法
6.2.2 考慮正確幾率的算法——蒙特卡羅算法
6.3 隨機序列提高算法的平均復雜度——舍伍德算法
6.4 隨機生成答案并檢測答案正確性——拉斯維加斯算法
第7章 算法設計實踐
7.1 循環賽日程表(4種)
7.2 求3個數的最小公倍數(4種)
7.3 猴子選大王(4種)
7.4 最大子段和問題(5種)
7.5 背包問題(11種)
7.5.1 與利潤無關的背包問題
7.5.2 與利潤有關的背包問題
7.6 主元素問題(6種)
附錄 算法設計與分析課程設計大綱