算法设计手册:实用算法设计与分析

需积分: 41 9 下载量 21 浏览量 更新于2024-07-26 收藏 3.89MB PDF 举报
"The Algorithm Design Manual" 是一本由Steven S. Skiena编写的经典书籍,主要探讨算法设计和分析的实践方法。这本书的第二版详细介绍了如何设计和评估算法,适用于程序员、面试准备者以及对算法感兴趣的读者。 该书分为多个章节,详细讲解了算法设计的关键概念和技术。第一章“Introduction to Algorithm Design”引入了算法设计的基本思想,通过实例如Robot Tour Optimization和Selecting the Right Jobs来展示问题解决策略,并讨论了正确性证明、问题建模和“战争故事”(实际应用案例)的重要性。 第二章“Algorithm Analysis”讲解了计算模型,特别是RAM模型,以及大O表示法,用于描述算法的时间复杂度。它还涵盖了增长率、效率推理、对数运算及其应用,以及对金字塔建造之谜的战争故事,进一步阐述了高级分析技巧。 第三章“Data Structures”介绍了不同数据结构,如连续与链式结构的对比,栈、队列、字典、二叉搜索树、优先队列、哈希表和字符串处理,以及它们在解决特定问题中的应用。 第四章“Sorting and Searching”讨论了排序和查找算法,包括排序的应用、堆排序、归并排序、快速排序、分布排序等,以及二分搜索和分治策略。通过战争故事展示了这些算法在实际场景中的应用,如机票预订系统。 第五章“Graph Traversal”深入探讨了图论,包括图的类型、数据结构、广度优先搜索和深度优先搜索,以及它们在路径查找、最短路径计算等方面的应用。 这本书不仅提供了理论知识,还包含大量实际问题的案例分析和练习题,有助于读者巩固理解并提升算法设计能力。对于想要提高编程技能或准备技术面试的人来说,是一份宝贵的资源。
2009-04-29 上传
英文第二版 目录 . . . . . . . . . . . . . . . . . . . . . . . 50 2.8 War Story: Mystery of the Pyramids . . . . . . . . . . . . . . . . 51 2.9 Advanced Analysis (*) . . . . . . . . . . . . . . . . . . . . . . . . 54 2.10 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3 Data Structures 65 3.1 Contiguous vs. Linked Data Structures . . . . . . . . . . . . . . . 66 xii CONTENTS 3.2 Stacks and Queues . . . . . . . . . . . . . . . . . . . . . . . . . . 71 3.3 Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 3.4 Binary Search Trees . . . . . . . . . . . . . . . . . . . . . . . . . . 77 3.5 Priority Queues . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 3.6 War Story: Stripping Triangulations . . . . . . . . . . . . . . . . 85 3.7 Hashing and Strings . . . . . . . . . . . . . . . . . . . . . . . . . 89 3.8 Specialized Data Structures . . . . . . . . . . . . . . . . . . . . . 93 3.9 War Story: String ’em Up . . . . . . . . . . . . . . . . . . . . . . 94 3.10 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 4 Sorting and Searching 103 4.1 Applications of Sorting . . . . . . . . . . . . . . . . . . . . . . . . 104 4.2 Pragmatics of Sorting . . . . . . . . . . . . . . . . . . . . . . . . . 107 4.3 Heapsort: Fast Sorting via Data Structures . . . . . . . . . . . . 108 4.4 War Story: Give me a Ticket on an Airplane . . . . . . . . . . . 118 4.5 Mergesort: Sorting by Divide-and-Conquer . . . . . . . . . . . . 120 4.6 Quicksort: Sorting by Randomization . . . . . . . . . . . . . . . 123 4.7 Distribution Sort: Sorting via Bucketing . . . . . . . . . . . . . . 129 4.8 War Story: Skiena for the Defense . . . . . . . . . . . . . . . . . 131 4.9 Binary Search and Related Algorithms . . . . . . . . . . . . . . . 132 4.10 Divide-and-Conquer . . . . . . . . . . . . . . . . . . . . . . . . . . 135 4.11 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 5 Graph Traversal 145 5.1 Flavors of Graphs . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 5.2 Data Structures for Graphs . . . . . . . . . . . . . . . . . . . . . 151 5.3 War Story: I was a Victim ofMoore’s Law . . . . . . . . . . . . 155 5.4 War Story: Getting the Graph . . . . . . . . . . . . . . . . . . . . 158 5.5 Traversing a Graph . . . . . . . . . . . . . . . . . . . . . . . . . . 161 5.6 Breadth-First Search . . . . . . . . . . . . . . . . . . . . . . . . . 162 5.7 Applications of Breadth-First Search . . . . . . . . . . . . . . . . 166 5.8 Depth-First Search . . . . . . . . . . . . . . . . . . . . . . . . . . 169 5.9 Applications of Depth-First Search . . . . . . . . . . . . . . . . . 172 5.10 Depth-First Search on Directed Graphs . . . . . . . . . . . . . . 178 5.11 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 6 Weighted Graph Algorithms 191 6.1 Minimum Spanning Trees . . . . . . . . . . . . . . . . . . . . . . 192 6.2 War Story: Nothing but Nets . . . . . . . . . . . . . . . . . . . . 202 6.3 Shortest Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 6.4 War Story: Dialing for Documents . . . . . . . . . . . . . . . . . 212 6.5 Network Flows and Bipartite Matching . . . . . . . . . . . . . . 217 6.6 Design Graphs, Not Algorithms . . . . . . . . . . . . . . . . . . . 222 6.7 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 CONTENTS xiii 7 Combinatorial Search and Heuristic Methods 230 7.1 Backtracking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 7.2 Search Pruning . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 7.3 Sudoku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 7.4 War Story: Covering Chessboards . . . . . . . . . . . . . . . . . . 244 7.5 Heuristic SearchMethods . . . . . . . . . . . . . . . . . . . . . . 247 7.6 War Story: Only it is Not a Radio . . . . . . . . . . . . . . . . . 260 7.7 War Story: Annealing Arrays . . . . . . . . . . . . . . . . . . . . 263 7.8 Other Heuristic SearchMethods . . . . . . . . . . . . . . . . . . 266 7.9 Parallel Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . 267 7.10 War Story: Going Nowhere Fast . . . . . . . . . . . . . . . . . . . 268 7.11 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 8 Dynamic Programming 273 8.1 Caching vs. Computation . . . . . . . . . . . . . . . . . . . . . . 274 8.2 Approximate String Matching . . . . . . . . . . . . . . . . . . . . 280 8.3 Longest Increasing Sequence . . . . . . . . . . . . . . . . . . . . . 289 8.4 War Story: Evolution of the Lobster . . . . . . . . . . . . . . . . 291 8.5 The Partition Problem . . . . . . . . . . . . . . . . . . . . . . . . 294 8.6 Parsing Context-Free Grammars . . . . . . . . . . . . . . . . . . 298 8.7 Limitations of Dynamic Programming: TSP . . . . . . . . . . . . 301 8.8 War Story: What’s Past is Prolog . . . . . . . . . . . . . . . . . . 304 8.9 War Story: Text Compression for Bar Codes . . . . . . . . . . . 307 8.10 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 9 Intractable Problems and Approximation Algorithms 316 9.1 Problems and Reductions . . . . . . . . . . . . . . . . . . . . . . 317 9.2 Reductions for Algorithms . . . . . . . . . . . . . . . . . . . . . . 319 9.3 Elementary Hardness Reductions . . . . . . . . . . . . . . . . . . 323 9.4 Satisfiability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 9.5 Creative Reductions . . . . . . . . . . . . . . . . . . . . . . . . . 330 9.6 The Art of Proving Hardness . . . . . . . . . . . . . . . . . . . . 334 9.7 War Story: Hard Against the Clock . . . . . . . . . . . . . . . . . 337 9.8 War Story: And Then I Failed . . . . . . . . . . . . . . . . . . . . 339 9.9 P vs. NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 9.10 Dealing with NP-complete Problems . . . . . . . . . . . . . . . . 344 9.11 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 10 How to Design Algorithms 356 II The Hitchhiker’s Guide to Algorithms 361 11 A Catalog of Algorithmic Problems 363 xiv CONTENTS 12 Data Structures 366 12.1 Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 12.2 Priority Queues . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 12.3 Suffix Trees and Arrays . . . . . . . . . . . . . . . . . . . . . . . . 377 12.4 Graph Data Structures . . . . . . . . . . . . . . . . . . . . . . . . 381 12.5 Set Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . . 385 12.6 Kd-Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 13 Numerical Problems 393 13.1 Solving Linear Equations . . . . . . . . . . . . . . . . . . . . . . . 395 13.2 Bandwidth Reduction . . . . . . . . . . . . . . . . . . . . . . . . 398 13.3 Matrix Multiplication . . . . . . . . . . . . . . . . . . . . . . . . . 401 13.4 Determinants and Permanents . . . . . . . . . . . . . . . . . . . . 404 13.5 Constrained and Unconstrained Optimization . . . . . . . . . . . 407 13.6 Linear Programming . . . . . . . . . . . . . . . . . . . . . . . . . 411 13.7 Random Number Generation . . . . . . . . . . . . . . . . . . . . 415 13.8 Factoring and Primality Testing . . . . . . . . . . . . . . . . . . . 420 13.9 Arbitrary-Precision Arithmetic . . . . . . . . . . . . . . . . . . . 423 13.10 Knapsack Problem . . . . . . . . . . . . . . . . . . . . . . . . . . 427 13.11 Discrete Fourier Transform . . . . . . . . . . . . . . . . . . . . . 431 14 Combinatorial Problems 434 14.1 Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 14.2 Searching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441 14.3 Median and Selection . . . . . . . . . . . . . . . . . . . . . . . . . 445 14.4 Generating Permutations . . . . . . . . . . . . . . . . . . . . . . . 448 14.5 Generating Subsets . . . . . . . . . . . . . . . . . . . . . . . . . . 452 14.6 Generating Partitions . . . . . . . . . . . . . . . . . . . . . . . . . 456 14.7 Generating Graphs . . . . . . . . . . . . . . . . . . . . . . . . . . 460 14.8 Calendrical Calculations . . . . . . . . . . . . . . . . . . . . . . . 465 14.9 Job Scheduling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 14.10 Satisfiability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 15 Graph Problems: Polynomial-Time 475 15.1 Connected Components . . . . . . . . . . . . . . . . . . . . . . . 477 15.2 Topological Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . 481 15.3 Minimum Spanning Tree . . . . . . . . . . . . . . . . . . . . . . . 484 15.4 Shortest Path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489 15.5 Transitive Closure and Reduction . . . . . . . . . . . . . . . . . . 495 15.6 Matching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498 15.7 Eulerian Cycle/Chinese Postman . . . . . . . . . . . . . . . . . . 502 15.8 Edge and Vertex Connectivity . . . . . . . . . . . . . . . . . . . . 505 15.9 Network Flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 15.10 Drawing Graphs Nicely . . . . . . . . . . . . . . . . . . . . . . . . 513 CONTENTS xv 15.11 Drawing Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 15.12 Planarity Detection and Embedding . . . . . . . . . . . . . . . . 520 16 Graph Problems: Hard Problems 523 16.1 Clique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 16.2 Independent Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 16.3 Vertex Cover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 16.4 Traveling Salesman Problem . . . . . . . . . . . . . . . . . . . . . 533 16.5 Hamiltonian Cycle . . . . . . . . . . . . . . . . . . . . . . . . . . 538 16.6 Graph Partition . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 16.7 Vertex Coloring . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 16.8 Edge Coloring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 16.9 Graph Isomorphism . . . . . . . . . . . . . . . . . . . . . . . . . . 550 16.10 Steiner Tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 16.11 Feedback Edge/Vertex Set . . . . . . . . . . . . . . . . . . . . . . 559 17 Computational Geometry 562 17.1 Robust Geometric Primitives . . . . . . . . . . . . . . . . . . . . 564 17.2 Convex Hull . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568 17.3 Triangulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572 17.4 Voronoi Diagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 17.5 Nearest Neighbor Search . . . . . . . . . . . . . . . . . . . . . . . 580 17.6 Range Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584 17.7 Point Location . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587 17.8 Intersection Detection . . . . . . . . . . . . . . . . . . . . . . . . 591 17.9 Bin Packing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595 17.10 Medial-Axis Transform . . . . . . . . . . . . . . . . . . . . . . . . 598 17.11 Polygon Partitioning . . . . . . . . . . . . . . . . . . . . . . . . . 601 17.12 Simplifying Polygons . . . . . . . . . . . . . . . . . . . . . . . . . 604 17.13 Shape Similarity . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607 17.14 Motion Planning . . . . . . . . . . . . . . . . . . . . . . . . . . . 610 17.15 Maintaining Line Arrangements . . . . . . . . . . . . . . . . . . . 614 17.16 Minkowski Sum . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617 18 Set and String Problems 620 18.1 Set Cover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621 18.2 Set Packing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625 18.3 String Matching . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628 18.4 Approximate String Matching . . . . . . . . . . . . . . . . . . . . 631 18.5 Text Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . 637 18.6 Cryptography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641 18.7 Finite State Machine Minimization . . . . . . . . . . . . . . . . . 646 18.8 Longest Common Substring/Subsequence . . . . . . . . . . . . . 650 18.9 Shortest Common Superstring . . . . . . . . . . . . . . . . . . . . 654 xvi CONTENTS 19 Algorithmic Resources 657 19.1 Software Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . 657 19.2 Data Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663 19.3 Online Bibliographic Resources . . . . . . . . . . . . . . . . . . . 663 19.4 Professional Consulting Services . . . . . . . . . . . . . . . . . . . 664 Bibliography 665 Index 709