普通高等教育"十一五"規劃教材
數值分析 第5版
李慶揚 王能超 易大義 著
清華大學齣版社
本書是為理工科大學各專業普遍開設的“數值分析”課程編寫的教材,其內容包括插值與逼近,數值微分與數值積分,非綫性方程與綫性方程組的數值解法,矩陣的特徵值與特徵嚮量計算,常微分方程數值解法,每章附有習題並在書末給齣瞭部分答案,每章還附有復習與思考題和計算實習題,全書闡述嚴謹,脈絡分明,深入淺齣,便於教學。
第1章數值分析與科學計算引論
1.1數值分析的對象、作用與特點
1.2數值計算的誤差
1.3誤差定性分析與避免誤差危害
1.4數值計算中算法設計的技術
1.5數學軟件
評注
復習與思考題
習題
第2章插值法
2.1 引言
2.3均差與牛頓插值多項式
2.4埃爾米特插值
2.5分段低次插值
2.6三次樣條插值
評注
復習與思考題
習題
第3章 函數逼近與快速傅裏葉變換
3.1函數逼近的基本概念
3.2正交多項式
……
第4章數值積分與數值微分
第5章解綫性方程組的直接方法
第6章解綫性方程組的迭代法
第7章非綫性方程與方程組的數值解法
第8章矩陣特徵值計算
第9章常微分方程初值問題數值解法
部分習題答案
參考文獻
序言
本書第5版已列入普通高等教育“十一五”規劃教材,主要作為理科數學類專業本科生及其他理工科碩士研究生“數值分析”課程的教材。根據“數值分析”課程教學大綱的要求,對第4版做瞭適當修改,但仍保留原教材的基本結構和大部分內容。主要修改部分如下:
(1)在內容上精簡瞭一些較少使用的算法及一些較繁雜的推導和證明;加強瞭算法基本思想的分析和使用的說明;另外還增加瞭一些新內容,如自適應求積和重積分的計算,解綫性方程組的共軛梯度法,代數方程求根的病態分析,常微分方程數值解法中多步法的收斂性與穩定性分析,剛性問題等。
(2)評注中增加瞭一些曆史發展及使用數學軟件的說明;每章增加瞭復習與思考題,這有助於讀者加深對基本內容的理解,促進對所講算法的掌握;另外為加強使用計算機解題練習,增添瞭一些計算實習題。
(3)根據本書新版的特點,刪去瞭並行算法的附錄,有關並行算法目前有很多普及的入門著作,需要瞭解的可自己學習。另外,本書推薦讀者使用MATLAB語言及數學庫,有關MATLAB的使用本書也不做介紹,目前也有很多介紹的書籍可供參考。
本書第5版主要由李慶揚負責修改,是在清華大學齣版社及本書編輯劉穎博士推動和支持下完成的,還得到清華大學給予的經費資助,作者對他們的支持和幫助錶示衷心感謝。
希望使用本書的老師和同學對本書存在的問題給予批評指正。
文摘
插圖:
《算法設計與分析導論》 引言 在當今信息技術飛速發展的時代,高效、可靠的算法是解決復雜計算問題的基石。從搜索引擎的網頁排序,到人工智能的模式識彆,再到大數據的高效處理,無一不依賴於精妙的算法設計與嚴謹的分析。本書旨在為讀者係統地介紹算法設計的核心思想、常用技巧以及分析方法,幫助讀者掌握設計高效算法的能力,並能深入理解算法的性能,從而在實際應用中做齣明智的選擇。我們將重點關注算法的正確性、時間復雜度和空間復雜度,並通過大量的實例來闡述各種算法的原理與應用。 第一章 緒論:算法的基石 本章我們將首先定義什麼是算法,並探討算法在計算機科學中的重要性。我們將引入解決問題的基本框架,以及算法設計需要考慮的關鍵因素。 1.1 什麼是算法? 算法的定義:一套明確的指令集,用於解決特定問題。 算法的特性:有窮性、確定性、可行性、輸入、輸齣。 算法在計算機科學中的地位:軟件開發的靈魂,性能的決定因素。 1.2 算法設計的思考過程 理解問題:清晰地定義問題的輸入、輸齣和約束條件。 抽象與建模:將實際問題轉化為計算機可以處理的模型。 選擇閤適的數據結構:數據結構對算法效率至關重要。 設計基本思路:探索不同的解決方案。 優化與改進:不斷提升算法的性能。 1.3 算法的度量:復雜性分析 為何需要度量算法? 性能評估、效率比較、瓶頸識彆。 漸進符號 (Asymptotic Notation): 大O符號 (O):上界,錶示算法運行時間的上限。 大Omega符號 (Ω):下界,錶示算法運行時間的下限。 大Theta符號 (Θ):緊界,錶示算法運行時間的精確界限。 時間復雜度 (Time Complexity):算法執行時間與輸入規模的關係。 常數時間 O(1) 對數時間 O(log n) 綫性時間 O(n) 對數綫性時間 O(n log n) 平方時間 O(n^2) 指數時間 O(2^n) 空間復雜度 (Space Complexity):算法運行時占用的內存空間與輸入規模的關係。 最壞情況、最好情況和平均情況分析。 第二章 遞歸與分治策略 遞歸是一種強大的編程範式,許多高效算法都基於遞歸思想。分治策略是一種將大問題分解為小問題,分彆解決後再閤並答案的通用算法設計技巧。 2.1 遞歸的概念與應用 遞歸的定義:函數調用自身。 遞歸的要素:基本情況 (Base Case) 和遞歸步驟 (Recursive Step)。 遞歸的優缺點:代碼簡潔,易於理解,但可能導緻棧溢齣和效率問題。 遞歸的轉化:如何將遞歸轉化為迭代。 2.2 分治策略 (Divide and Conquer) 分治策略的基本思想: 1. 分解 (Divide):將問題分解成若乾個規模較小但結構相似的子問題。 2. 解決 (Conquer):遞歸地解決這些子問題。 3. 閤並 (Combine):將子問題的解閤並起來,得到原問題的解。 典型應用: 二分搜索 (Binary Search):在有序數組中快速查找元素。 閤並排序 (Merge Sort):高效的比較排序算法。 快速排序 (Quick Sort):平均情況下性能優越的排序算法。 大整數乘法:Strassen算法等。 2.3 遞歸方程的求解 主定理 (Master Theorem):用於求解形如 $T(n) = aT(n/b) + f(n)$ 的遞歸方程。 替換法 (Substitution Method)。 遞歸樹法 (Recursion Tree Method)。 第三章 動態規劃 動態規劃是一種通過將問題分解為重疊子問題,並存儲子問題的解以避免重復計算的算法設計方法。它尤其適用於解決最優化問題。 3.1 動態規劃的基本思想 重疊子問題 (Overlapping Subproblems):問題可以分解成子問題,並且子問題會重復齣現。 最優子結構 (Optimal Substructure):問題的最優解包含其子問題的最優解。 自頂嚮下 (帶備忘錄) 與自底嚮上 (錶格法)。 3.2 動態規劃的設計步驟 定義狀態:用一個或多個變量錶示子問題的解。 建立狀態轉移方程:描述如何從一個子問題的解推導齣另一個子問題的解。 確定邊界條件:定義最小規模子問題的解。 計算過程:按照一定的順序計算所有子問題的解。 構造原問題的解:從已計算齣的子問題解中導齣原問題的解。 3.3 典型動態規劃問題 斐波那契數列:使用動態規劃優化計算。 背包問題 (Knapsack Problem):0/1背包、多重背包、完全背包。 最長公共子序列 (Longest Common Subsequence, LCS)。 最長遞增子序列 (Longest Increasing Subsequence, LIS)。 矩陣鏈乘法 (Matrix Chain Multiplication)。 旅行商問題 (Traveling Salesperson Problem, TSP) 的近似解(動態規劃可以找到精確解,但時間復雜度很高)。 區間調度問題。 第四章 貪心算法 貪心算法是一種在每一步選擇局部最優解,希望最終能達到全局最優解的算法。它通常比動態規劃更簡單,但並非所有問題都適用。 4.1 貪心算法的策略 局部最優選擇:在每一步選擇當前看起來最優的選項。 證明貪心選擇的性質:證明局部最優選擇能夠導緻全局最優解。 證明最優子結構的性質:問題的最優解包含其子問題的最優解。 4.2 典型貪心算法應用 霍夫曼編碼 (Huffman Coding):用於數據壓縮。 活動選擇問題 (Activity Selection Problem)。 最小生成樹 (Minimum Spanning Tree, MST): Prim算法 Kruskal算法 最短路徑問題 (Shortest Path Problem): Dijkstra算法 (適用於非負權重的圖) 4.3 貪心算法的局限性 並非所有問題都能用貪心算法解決。 需要仔細證明貪心策略的正確性。 第五章 圖算法 圖是錶示對象之間關係的重要數據結構。圖算法在網絡分析、路徑規劃、社交網絡分析等領域有著廣泛應用。 5.1 圖的錶示 鄰接矩陣 (Adjacency Matrix)。 鄰接錶 (Adjacency List)。 5.2 圖的遍曆 廣度優先搜索 (Breadth-First Search, BFS):按層級順序訪問圖。 應用:最短路徑(無權圖)、連通性判斷。 深度優先搜索 (Depth-First Search, DFS):沿著一條路徑盡可能深地訪問。 應用:拓撲排序、查找強連通分量、連通性判斷。 5.3 最短路徑算法 Dijkstra算法 (單源最短路徑,非負權邊)。 Bellman-Ford算法 (單源最短路徑,可處理負權邊,但不能有負權迴路)。 Floyd-Warshall算法 (所有頂點對最短路徑)。 5.4 最小生成樹算法 Prim算法 Kruskal算法 5.5 拓撲排序 (Topological Sort) 適用於有嚮無環圖 (DAG) 的排序。 基於DFS或Kahn算法。 5.6 強連通分量 (Strongly Connected Components, SCC) Tarjan算法、Kosaraju算法。 第六章 搜索算法與迴溯法 搜索算法旨在從一個巨大的狀態空間中找到滿足特定條件的解。迴溯法是一種係統地搜索解空間的方法。 6.1 狀態空間樹 (State Space Tree) 錶示問題的所有可能解的樹狀結構。 搜索的目標是在樹中找到滿足條件的葉節點或路徑。 6.2 深度優先搜索 (DFS) 與廣度優先搜索 (BFS) 在搜索中的應用 DFS:先探索分支,可能更快找到第一個解。 BFS:找到最短路徑或最少步驟的解。 6.3 迴溯法 (Backtracking) 基本思想:當發現當前路徑無法通嚮解時,退迴一步,嘗試另一條路徑。 剪枝 (Pruning):在搜索過程中,如果確定當前分支不可能産生解,則放棄該分支。 典型迴溯問題: N皇後問題:在N×N的棋盤上放置N個皇後,使得任意兩個皇後不能互相攻擊。 數獨求解。 組閤生成。 排列生成。 第七章 字符串匹配算法 字符串匹配是計算機科學中的一個基本問題,廣泛應用於文本編輯、搜索引擎、生物信息學等領域。 7.1 樸素字符串匹配算法 逐個字符比較。 時間復雜度分析:O(mn)。 7.2 改進的字符串匹配算法 KMP算法 (Knuth-Morris-Pratt Algorithm):利用模式串的特性,避免不必要的比較。 前綴函數 (Prefix Function) 的構建。 匹配過程。 時間復雜度:O(n+m)。 Boyer-Moore算法:從模式串的末尾開始匹配,具有更快的平均性能。 壞字符規則 (Bad Character Rule)。 好後綴規則 (Good Suffix Rule)。 Rabin-Karp算法:利用哈希函數進行匹配,適用於多模式匹配。 第八章 計算幾何初步 計算幾何研究使用算法解決幾何問題。本章將介紹一些基本的計算幾何概念和算法。 8.1 點、綫段、多邊形 基本幾何對象及其錶示。 嚮量運算。 8.2 凸包 (Convex Hull) 定義:包含一組點的最小凸多邊形。 算法: Jarvis步進法 (Gift Wrapping) Graham掃描法 分治法 8.3 綫段相交檢測 判斷兩條綫段是否相交。 8.4 點在多邊形內部的判斷 射綫法 (Ray Casting Algorithm)。 第九章NP完全性理論 NP完全性理論是計算復雜性理論的核心內容,它將問題按照計算難度進行分類,並提齣瞭“P vs NP”這一計算機科學中最重要的問題之一。 9.1 可判定問題與可計算問題 可判定問題:存在算法能判斷輸入是否滿足某個性質。 可計算問題:存在算法能解決該問題。 9.2 P類問題與NP類問題 P類問題:可以在多項式時間內解決的問題。 NP類問題:可以在多項式時間內驗證其解的問題。 P ⊆ NP。 9.3 NP-難 (NP-Hard) 與 NP-完全 (NP-Complete) NP-難:比NP類問題計算難度更大或相等的問題。 NP-完全:既是NP類問題,又是NP-難的問題。 多項式歸約 (Polynomial Reduction):將一個問題轉化為另一個問題,其轉化過程可以在多項式時間內完成。 9.4 重要的NP完全問題 可滿足性問題 (SAT)。 旅行商問題 (TSP)。 背包問題 (Knapsack Problem)。 圖著色問題 (Graph Coloring)。 子集和問題 (Subset Sum Problem)。 9.5 應對NP完全問題 尋找精確解(通常時間復雜度很高)。 設計近似算法 (Approximation Algorithms)。 設計啓發式算法 (Heuristic Algorithms)。 第十章 算法分析工具與技巧 本章將介紹一些更高級的算法分析工具和技巧,幫助讀者更深入地理解算法的性能。 10.1 隨機化算法 (Randomized Algorithms) 在算法設計中引入隨機性。 期望運行時間分析。 典型應用:快速排序的隨機化版本、Miller-Rabin素性測試。 10.2 攤還分析 (Amortized Analysis) 分析一係列操作的總成本,而不是單個操作的最壞成本。 聚閤分析法、會計法、勢能法。 應用:動態數組、二叉堆。 10.3 字符串數據結構 Trie (前綴樹)。 Suffix Tree (後綴樹)。 Suffix Array (後綴數組)。 結論 《算法設計與分析導論》為讀者提供瞭一個全麵深入的算法學習框架。通過掌握這些核心算法設計策略、分析方法以及典型算法,讀者將能夠更好地理解和解決復雜的計算問題,為未來的學習和工程實踐打下堅實的基礎。算法的智慧在於其通用性與高效性,不斷探索和優化算法,將是我們在信息時代不斷前進的動力。
這本書的裝幀設計倒是挺吸引我的,封麵采用瞭比較經典的學術風格,但又不失現代感,一種沉穩而又充滿智慧的氣息撲麵而來。紙張的質感也相當不錯,摸起來光滑但又不反光,印刷清晰,字跡銳利,即使長時間閱讀也不會感到眼睛疲勞。翻開書本,目錄結構的安排也很清晰,章節之間的過渡自然,能夠讓人迅速把握全書的整體脈絡。我尤其喜歡它在一些關鍵概念的引入部分,常常會穿插一些曆史背景的介紹,或者聯係實際應用場景,這讓原本可能顯得枯燥的理論知識變得生動有趣起來,也更容易激發起我對這些知識點背後原理的好奇心。而且,它在排版上留白也恰到好處,不會顯得過於擁擠,方便我在旁邊做筆記,標記重點。我個人比較注重學習的體驗感,從這一點來說,這本書無疑是閤格的,甚至可以說是優秀的。它讓我在拿到書的那一刻起,就充滿瞭閱讀的動力和期待,這種初步的好感,對於之後深入學習無疑是打下瞭良好的基礎。