算法引論:一種創造性方法(書)

原書名:Introduction to Algorithms: A Creative Approach
原出版社:Addison Wesley/Pearson
作者:(美)Udi Manber
譯者:黃林鵬 謝瑾奎 陸首博
叢書名:國外計算機科學教材系列
出版社:電子工業出版社
ISBN:9787121016653
出版日期:2005年09月
開本:16開
頁碼:334
版次:1-1

目錄


第1章 引論
第2章 數學歸納法
2.1 引言
2.2 三個簡單的例子
2.3 平面內區域的計數
2.4 簡單的着色問題
2.5 複雜一些的加法題
2.6 一個簡單的不等式
2.7 歐拉公式
2.8 圖論中的一個問題
2.9 格雷碼
2.10 在圖上尋找無重邊的路
2.11 數學平均數和幾何平均數定理
2.12 循環不變量:將十進制數轉換爲二進制數
2.13 常見的錯誤
2.14 小結
第3章 算法分析
3.1 引言
3.2 符號D
3.3 時間與空間複雜度
3.4 求和
3.5 遞推關係
3.5.1 巧妙地猜測
3.5.2 分治關係
3.5.3 涉及全部歷史的遞推關係
3.6 一些有用的證明論據
3.7 小結
第4章 數據結構簡介
4.1 引言
4.2 基本數據結構
4.2.1 元素
4.2.2 數組
4.2.3 記錄
4.2.4 鏈表
4.3 樹
4.3.1 樹的表示
4.3.2 堆
4.3.3 二叉搜索樹
4.3.4 AVL樹
4.4 散列
4.5 合併—查找問題
4.6 圖
4.7 小結
第5章 基於歸納的算法設計
5.1 引言
5.2 多項式求值
5.3 最大導出子圖
5.4 尋找一對一映射
5.5 社會名流問題
5.6 分治算法:輪廓問題
5.7 在二叉樹中計算平衡因子
5.8 尋找最大連續子序列
5.9 增強歸納假設
5.10 動態規劃:揹包問題
5.11 常見的錯誤
5.12 小結
第6章 序列和集合的算法
6.1 引言
6.2 二叉搜索的幾種形式
6.2.1 純二叉搜索
6.2.2 循環序列的二叉搜索
6.2.3 二叉搜索特殊下標
6.2.4 二叉搜索長度未知的序列
6.2.5 重疊子序列問題
6.2.6 解方程
6.3 內插搜索
6.4 排序
6.4.1 桶排序和基數排序
6.4.2 插入排序和選擇排序
6.4.3 歸併排序
6.4.4 快速排序
6.4.5 堆排序
6.4.6 排序問題的下界
6.5 順序統計
6.5.1 最大數和最小數
6.5.2 查找第足小的數
6.6 數據壓縮
6.7 串匹配
6.8 序列比較
6.9 概率算法
6.9.1 隨機數
6.9.2 着色問題
6.9.3 將拉斯維加斯算法變換成確定性算法
6.10 查找衆數
6.11 三個展現有趣證明方法的問題
6.11.1 最長遞增序列
6.11.2 查找集合中兩個最大的元素
6.11.3 計算多重集合的模
6.12 小結
第7章 圖算法
7.1 引言
7.2 歐拉圖
7.3 圖的遍歷
7.3.1 深度優先搜索
7.3.2 廣度優先搜索
7.4 拓撲排序
7.5 單源最短路徑
7.6 最小代價生成樹
7.7 全部最短路徑
7.8 傳遞閉包
7.9 圖的分解
7.9.1 雙連通分支
7.9.2 強連通分支
7.9.3 利用圖分解的例子
7.10 配
7.10.1 非常稠密圖中的完美匹配
7.10.2 偶圖匹配
7.11 網絡流量
7.12 哈密爾頓旅行
7.12.1 反向歸納
7.12.2 在非常稠密圖中找哈密爾頓迴路
7.13 小結
第8章 幾何算法
8.1 引言
8.2 判定點是否在多邊形內部
8.3 構造簡單多邊形
8.4 凸包
8.4.1 直接方法
8.4.2 禮品包裹算法
8.4.3 Graham掃描算法
8.5 最近點對
8.6 水平線段和豎直線段的交點
8.7 小結
第9章 代數和數值算法
9.1 引言
9.2 求冪運算
9.3 歐幾里得算法
9.4 多項式乘法
9.5 矩陣乘法
9.5.1 Winograd算法
9.5.2 Strassen算法
9.5.3 布爾矩陣
9.6 快速傅里葉變換
9.7 小結
第10章 歸約
10.1 引言
10.2 歸約的例子
10.2.1 簡單字符串匹配問題
10.2.2 特殊代表集
10.2.3 關於序列比較的歸約
10.2.4 在無向圖中尋找三角形
10.3 有關線性規劃的歸約
10.3.1 概述與定義
10.3.2 歸約到線性規劃的例子
10.4 下界的歸約
10.4.1 尋找簡單多邊形算法複雜度的下界
10.4.2 關於矩陣的簡單歸約
10.5 常見的錯誤
10.6 小結
第11章 NP完全問題
11.1 引言
11.2 多項式時間歸約
11.3 非確定性和Cook定理
11.4 NP完全性的證明例子
11.4.1 頂點覆蓋問題
11.4.2 支配集問題
11.4.3 3SAT問題
11.4.4 團問題
11.4.5 3着色問題
11.4.6 一般經驗
11.4.7 更多的NP完全問題
11.5 處理NP完全問題的技術
11.5.1 回溯法和分枝限界法
11.5.2 確保性能的近似算法
11.6 小結
第12章 並行算法
12.1 引言
12.2 並行計算模型
12.3 共享存儲器算法
12.3.1 並行加
12.3.2 尋找最大數的算法
12.3.3 並行前綴問題
12.3.4 在鏈表中查尋秩
12.3.5 歐拉遍歷技術
12.4 連網絡上的算法
12.4.1 陣列上的排序
12.4.2 排序網絡
12.4.3 在樹中查找第k個最小元素
12.4.4 網孔上的矩陣乘法
12.4.5 超立方體中的路由
12.5 脈動計算
12.5.1 矩陣與向量相乘
12.5.2 卷積問題
12.5.3 序列的比較
12.6 小結
部分習題答案
參考文獻

譯者序


本書作者烏迪·曼博(Udi Manber)博士是美國著名的計算機科學家, 國際公認的算法大師, 在線信息搜索引擎的先驅. 烏迪·曼博曾是美國亞利桑那大學計算機專業的教授, 離開學校後在雅虎公司擔任執行官, 目前是亞馬遜(Amazon. com)的副總裁和首席算法師(CAO), 也是亞馬遜旗下搜索網站A9. com的首席執行官, 他提出的UDI測試已經成爲衡量搜索引擎質量的評估標準.
本書的特色有二, 一是強調算法設計的創造性過程, 而不是拘泥於某個具體算法的詳細討論, 正如常言道“予之以魚, 不如授之以漁”. 在教學過程中常常發現有許多同學(包括譯者自己)不是去掌握算法背後的思想, 而是鑽牛角尖, 針對某個算法反覆地思考, 或者只是掌握了幾個具體的算法就沾沾自喜. 事實上學習算法不外乎兩個目的, 一是瞭解各種算法, 在遇到問題時能靈活地應用所掌握的方法技巧, 二個研究算法設計技術, 當沒有現成可用的算法時, 能夠創造出問題的求解方法. 前者非常實際, 但後者更加重要, 它涉及創新, 是推動學科發展的源泉. 本書中的習題就很有特色, 大致分爲兩類, 一類是操練型的, 意在鞏固對具體算法的瞭解, 鍛鍊學生應用書中介紹的算法以及各種變體的設計能力, 另一類是創造型的, 旨在讓學生掌握設計算法的技術而非算法本身, 由此鍛鍊學生的算法設計能力而不是算法應用能力. 這種體系結構是一種嘗試, 雖然目前市面上有許多大部頭的算法著作, 包括一些算法大師的名著, 但本書強調的是創造性, 具有濃郁特色, 因此時至今日仍有巨大的價值.
本書的特色之二是將算法設計類比于歸納證明. 事實上, 歸納證明. 遞歸算法. 遞推關係, 它們之間存在着千絲萬縷的聯繫. 對事物, 人們往往是從簡單到複雜, 從具體到抽象地進行思考, 猜測存在的性質並試圖證明, 最後得到一般性的規律再加以應用. 問題求解也是如此, 我們先從簡單的情況出發, 考慮簡單問題的解決方案, 然後再推廣到一般的情況, 在此過程中需要驗證的是這種推廣的有效性, 這無疑就是一種歸納證明. 作者將算法設計類比于歸納證明並貫穿全書, 將各種歸納方法演繹得淋漓盡致, 使通常的算法設計有章可循, 更使設計算法成爲一種享受.
譯者黃林鵬教授與本書的翻譯有着不解之緣. 2003年初, 譯者的研究生導師左孝凌教授擬修改他的離散數學教材, 準備添置論述歸納法的章節, 由此譯者爲他收集了許多關於歸納法的材料, 並粗讀了其中一部分, 也瞭解到了一些皮毛. 不料2004年暑假左老師因操勞過度, 竟不辭西去. 譯者希望能以這本與歸納法緊密相關的翻譯教材的出版向左老師及其未盡事業致敬. 此外就是關於並行計算中的脈動陣列算法, 15年前譯者在讀博士的時候, 恰好其博士生導師孫永強教授在做關於脈動陣列的研究, 譯者得以參與, 並對此稍有了解. 2000年譯者在美國哈佛大學進修, 遇到脈動陣列體系結構的創始人之一, 並有幸旁聽了他的課程. 而本書最後就是關於脈動陣列算法的, 讀來譯來, 會有些如偶遇故知和聆聽智者教誨的感覺. 雖然脈動陣列是本書成書時的研究熱點, 現在時過境遷, 已經是集羣計算. 分佈對象計算. 網格計算的時代, 但書中涉及的並行算法設計的思想依然璀璨, 富有啓迪. 事實上, 正是因爲強調的是算法設計的創造陛過程而非算法本身, 才使得本書可以永保活力.
本書的翻譯工作由上海交通大學的黃林鵬教授負責, 並與一些老師和博士生共同完成, 其中的第2章. 第4章. 第6章由陸首博初譯, 第3章. 第5章. 第7章由謝謹奎初譯, 參與本書翻譯工作的還有歐佳凡. 黃青. 楊歡. 林海源. 毛宏燕. 黃曉琴. 李東. 劉飛. 林琳. 王佳鋥. 耿向陽等同志, 陸朝俊和任慶生副教授對本書一些章節的翻譯提供了大量幫助. 在此, 對所有爲本書出版提供了幫助的人們表示誠摯的感謝!稿件由黃林鵬修改. 整理和定稿, 並對最終出現的問題負責, 請將批評意見寄至lphuang@sjtu. edu. cn, 不勝感激.

作譯者


Udi Manber美國著名的計算機科學家, 國際公認的算法大師, 在線信息搜索引擎的先驅. 1982年於華盛頓大學獲得計算機科學博士學位, 曾是美國亞利桑那大學計算機專業教授, 離開學校後在雅虎公司擔任執行官, 目前是亞馬遜(Amazon.com)的副總裁和首席算法大師(CAO), 也是亞馬遜施下搜索網站A9.com的首席執行官, 他提出的UDI測試已經成爲衡量搜索引擎質量的評估標準.

前言


編寫本書的動機來源於我在教學實踐中常常無法爲給定算法給出清晰解析的困惑. 與許多教師一樣, 我發現對一些學生來說, 要他們親自動手解決一些簡單問題有困難, 而讓他們理解給定問題的解決方案同樣有困難. 我相信, 事物的兩個方面——創造和解釋——是相關而不可分離的. 爲了完全瞭解一個問題, 考察最後的答案遠遠不夠, 我們必須瞭解問題的求解過程.
本書強調了算法設計的創造性方面, 其主要目的是要告訴讀者如何去設計一個新的算法. 本書描述算法的順序不是“問題x. 算法A. 算法A'. 程序P. 程序P'”, 而是像(但並不總是)“問題X. 直接明瞭的問題求解算法. 缺點. 改進這些缺點的困難. (可能包含一些錯誤的)好的算法. 進一步的改進. 分析以及其他方法和算法的關係”. 本書的目標不是給出一個容易轉換爲程序代碼的算法, 而是希望讀者理解算法的原理. 算法因此被解釋爲創造過程而不是最終產品. 我們講授算法的目標不僅是說明如何求解特定的問題, 還包括傳授如何求解未來將產生或遇到的新問題的技術. 可以說, 講授算法設計的思維過程與講授問題求解細節是同樣重要的.
爲了進一步幫助讀者構建算法創造的思維過程, 本書在算法設計過程中使用的是一種“老兵新傳”式的方法學. 該方法學除了涵蓋許多已知的算法設計技術外, 還是一個優雅的. 能深人解釋算法設計的直覺的框架. 然而, 該方法學並不能遍及算法設計所有可能的方法, 我們也不打算專用該方法學於算法設計過程. 該方法學的核心在於使用歸納法進行數學定理證明的智能過程與組合算法設計過程之間的相似性. 儘管這兩個過程的目的不同. 取得結果的類型有異, 但它們的相似程度卻比表面上看起來更多. 此相似性也已被許多人注意. 本書的新穎性在於對該相似性所進行的深度發掘, 並將說明該相似性除了涵蓋許多已知的算法設計技術外, 還可以在相當程度上幫助算法的創建. 對於該方法學, 本書第l章先做了簡單的介紹, 然後在第5章中進行形式化討論.
考慮下面的類比. 你來到一座陌生的城市, 租了一輛車, 現在想知道旅館的方向. 這時如果別人喋喋不休地告訴你城市的歷史. 佈局和交通狀況, 你肯定會覺得非常厭煩. 你所需要的其實是諸如“向前開. 過兩個街區. 右轉. 再直着向前開三英里”這樣的信息. 然而, 如果計劃在這座城市裏生活較長的時間, 那麼你的看法就會有所改變. 你可能希望在另一個方向上行駛一段時間(假定能找到一個人告訴你方向), 慢慢地你將對城市有更多的瞭解. 雖然本書也包含了許多問題的求解和解析, 但它不是一本告訴你所有具體目標其方位的書籍, 主要強調的是一般性的原理和方法. 本書的學習具有挑戰性, 它需要讀者的深入思考, 而我相信額外的努力是值得的.
在許多不同領域, 如數學. 統計學. 細胞生物學和工程學科, 高效非數值算法的設計已變得非常重要, 本書可作爲算法和非數值計算的導論性書籍. 許多專業人士, 甚至那些未曾和計算機有過緊密接觸的科學家, 會認爲程序設計是一種低級且無需智能的活動. 這種看法將導致簡單. 低效. 價值不高的問題解決方案, 而忽視優雅. 高效算法的存在. 本書的目的就是要向讀者說明-算法設計是一門既重要又雅緻的學問.
本書是自包含的, 大部分內容很直觀, 技術性細節儘量保持到最少或者與討論的主題內容分離, 特別是我們將算法實現細節和算法思想盡可能分離, 書中許多算法的設計都強調了這一原則. 本書並不是以哪些內容必須掌握和牢記這樣的方式來設計的, 而是通過思想. 例子. 反例. 修改. 改進等一系列過程加以闡述. 在大多數算法描述內容的後面給出了算法的僞代碼, 每章都包含習題和相關的文獻目錄. 大部分章節後面的習題可分爲兩類:操練型和創造型. 操練型習題的目的在於檢查讀者對於書中特定例子和算法的理解, 創造型習題的目的在於檢查讀者應用相應章節所介紹的特定算法和技術於新問題求解的能力. 本書最後給出了一些精選習題(習題編號加上了下劃線)的答案.
本書組織如下. 第1章到第4章的內容是介紹性的. 第2章涉及數學歸納法, 就我看來, 數學歸納法對於算法設計是非常重要的, 熟悉歸納法對於算法設計來說有莫大的幫助. 遺憾的是計算機科學系的學生對於歸納證明不是十分了解, 因此對一些學生來說, 第2章的內容可能比較困難, 建議他們在第一次閱讀本書的時候跳過那些有難度的例子, 待適當時候再回過頭來研究. 第3章涉及算法分析, 描述了算法分析的過程, 並給出對本書所討論的算法進行簡單分析所需要的工具. 第4章介紹了數據結構, 那些對數據結構熟悉且具備一定數學基礎的同學可以直接跳到第5章(但閱讀一下也是有益的)學習. 第5章提出了與歸納證明進行類比的算法設計思想, 並給出一些簡單的例子, 描述了算法設計過程. 如果你沒有太多時間, 只打算閱讀本書的一章, 則請直接閱讀第5章.
一般來說, 有關算法的書籍有兩種不同的組織結構, 一種是按照領域進行分類的, 如分成圖算法. 幾何算法等, 另一種是按照算法設計技術進行分類的. 雖然本書強調的是算法設計技術, 但我選擇了前者. 本書第6章到第9章分別給出了下面4個領域的算法:序列和集合的算法(如排序. 序列比較. 匹配等). 圖算法(如生或樹. 最短路徑. 匹配等)幾何算法(如凸包和交集問題等). 代數和數值算法(如矩陣乘法. 快速傅里葉變換等). 這種組織結構不但清晰且易於理解.
第10章涉及歸約或約簡. 儘管歸約的例子也出現在本書前面其他章節之中, 但該主題不但獨特而且重要, 因此有必要作爲一章的主題. 第10章的內容也是第11章的序幕, 後者涉及NP完全問題. 複雜度理論已經成爲算法的基本組成部分, 任何算法設計者都應該瞭解NP完全問題以及證明相關性質的技術. 第12章介紹了並行算法, 本章包含不同並行計算模型上的幾個有意義的算法.
本書內容或許不能在一個學期之內講授完畢. 因此對於教師來說就有多種不同的選擇. 開設的第一門算法設計課程可在某種深度上涉及第3章. 第5章. 第6章. 第7章和第8章的部分內容, 這些章節的高級部分以及第9章. 第10章. 第11章和12章的內容是可選的, 它們也可作爲高級算法課程的基礎.
致謝
首先要感謝我的妻子Rachel對於本書的幫助, 對本書所基於的方法學她給出了指導性的建議, 對於本書的內容她也給出了許多意見和忠告, 可以說沒有她就沒有本書. 特別感謝Jan
Van Leuwen對本書大部分章節所給出的全面的評論. 這些詳細的意見. 建議和修正方案爲本書增色不少. 感謝Eric Bach. Darrah
Chavey. Kirk Pruhs和Sun Wu, 他們在閱讀了本書的部分手稿後給出了建設性的意見, 感謝Guy T. Almes(賴斯大學). Agnes
H. Chan(美國東北大學). Dan Gusfield(加州大學Davis分校). David Harel(以色列魏茲曼學院). Daniel
Hirschberg(加州大學Irvine分校). Jefferey H. Kingston(愛荷華大學). Victor
Klee(華盛頓大學). Charles Martel(加州大學Davis分校). Michael J. Quinn(新罕布什爾大學)和Diane
M. Spresser(詹姆士·麥迪遜大學).
感謝Addison-Wesley出版公司的編輯沒有施加給我通常作者所經歷的有關書籍出版的恐怖經歷, 他們樂於助人, 並且充滿耐心. 特別感謝主管Bette
Aaronson, 本書的編輯Jim
DeWolf和LynDupre, 他們在寫作過程中引導我, 儘管知道有更好的方法, 但他們仍然允許我按照自己的方式行事. 在這裏, 我要感謝美國自然科學基金總統青年研究獎的資助以及AT&T. 數字設備公司. 惠普公司和Tektronix公司的資助.
然而, 必須強調的是, 最後的手稿是由排版人員(即作者自己)準備的, 他決定了這裏所列舉的許多人員對本書的評論和建議的取捨, 並且將對最後的結果負責.
烏迪·曼博
於美國亞利桑那州圖森市
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章