INTRODUCTION
TO ALGORITHMS
A Creative Approach
UDIMANBER
University of Arizona • • •ADDISON-WESLEY PUBLISHING COMPANY
Reading, Massachusetts • Menlo Park, California • New York Don Mills, Ontario • Wokingham, England • Amsterdam Bonn • Sydney • Singapore • Tokyo • Madrid • San Juan
Chapter 1 Chapter 2 Chapter 3 Introduction l Mathematical Induction 9 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 Introduction
Three Simple Examples Counting Regions in the Plane A Simple Coloring Problem
A More Complicated Summation Problem A Simple Inequality
Euler's Formula
A Problem in Graph Theory Gray Codes
Finding Edge-Disjoint Paths in a Graph Arithmetic versus Geometrie Mean Theorem
Loop Invariants: Converting a Decimal Number to Binary Common Errors
Summary
Bibliographie Notes and Further Reading Exercises 9 11 13 14 15 16 17 18 20 23 24 26 28 29 30 31 Analysis of Algorithms 37 3.1 3.2 3.3 3.4 3.5 3.6 3.7 Introduction The O Notation
Time and Space Complexity Summations
Recurrence Relations 3.5.1 Intelligent Guesses
3.5.2 Divide and Conquer Relations
3.5.3 Recurrence Relations with Füll History Useful Facts
Summary
Bibliographie Notes and Further Reading Exercises 37 39 42 43 46 47 50 51 53 55 55 56 I X
x Contents
Chapter 4 Data Structures 61
4.1 4.2
Introduction
Elementary Data Structures 4.2.1 Elements Arrays Records Linked Lists 4.3 4.2.2 4.2.3 4.2.4 Trees 4.3.1 4.3.2 4.3.3 4.3.4 4.4 4.5 4.6 4.7 Representation of Trees Heaps
Binary Search Trees AVL Trees
Hashing
The Union-Find Problem Graph s
Summary
Bibliographie Notes and Further Reading Exercises
Chapter 5 Design of Algorithms by Induction 91 5.1 Introduction
5.2 Evaluating Polynomials 5.3 Maximal Induced Subgraph 5.4 Finding One-to-One Mappings 5.5 The Celebrity Problem
5.6 A Divide-and-Conquer Algorithm: The Skyline Problem 5.7 Computing Balance Factors in Binary Trees
5.8 Finding the Maximum Consecutive Subsequence 5.9 Strengthening the Induction Hypothesis
5.10 Dynamic Programming: The Knapsack Problem 5.11 Common Errors
5.12 Summary
Bibliographie Notes and Further Reading Exercises
Chapter 6 Algorithms Involving Sequences and Sets 119 6.1 Introduction
6.2 Binary Search and Variations 6.3 Interpolation Search
6.4 Sorting
6.4.1 Bücket Sort and Radix Sort 6.4.2 Insertion Sort and Selection Sort 6.4.3 Mergesort 61 62 62 63 63 64 66 67 68 71 75 78 80 83 84 85 86 91 92 95 96 98 102 104 106 107 108 111 112 113 114 119 120 125 127 127 130 130
6.4.4 Quicksort 131 6.4.5 Heapsort 137 6.4.6 A Lower Bound for Sorting 141
6.5 Order Statistics 143 6.5.1 Maximum and Minimum Elements 143
6.5.2 Finding the M)-Smallest Element 144
6.6 Data Compression 145 6.7 String Matching 148 6.8 Sequence Comparisons 155 6.9 Probabilistic Algorithms 158 6.9.1 Random Numbers 160 6.9.2 A Coloring Problem 161 6.9.3 A Technique for Transforming Probabilistic
Algorithms into Deterministic Algorithms 161
6.10 Finding a Majority 164 6.11 Three Problems Exhibiting Interesting Proof Techniques 167
6.11.1 Longest Increasing Subsequence 167 6.11.2 Finding the Two Largest Elements in a Set 169
6.11.3 Computing the Mode of a Multiset 171
6.12 Summary 173 Bibliographie Notes and Further Reading 173
Exercises 175 Chapter7 Graph Algorithms 185
7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 7.10 7.11 7.12 Introduction Eulerian Graphs Graph Traversais 7.3.1 Depth-First Search 7.3.2 Breadth-First Search Topological Sorting
Single-Source Shortest Paths Minimum-Cost Spanning Trees All Shortest Paths
Transitive Closure Decompositions of Graphs 7.9.1 Biconnected Components 7.9.2 Strongly Connected Components
7.9.3 Examples of the Use of Graph Decomposition Matching
7.10.1 Perfect Matching in Very Dense Graphs 7.10.2 Bipartite Matching Network Flows Hamiltonian Tours 7.12.1 Reversed Induction 185 187 189 190 198 199 201 208 212 214 217 217 226 230 234 ,234 235 238 243 244
xii Contents
7.12.2 Finding Hamiltonian Cycles in Very Dense Graphs 244
7.13 Summary 246 Bibliographie Notes and Further Reading 247
Exercises 248
Chapter 8 Geometrie Algorithms 265
8.1 8.2 8.3 8.4 8.5 8.6 8.7 Introduction 265 Determining Whether a Point Is Inside a Polygon 266
Constructing Simple Polygons 270
Convex Hulls 273 8.4.1 A Straightforward Approach 273
8.4.2 Gift Wrapping 274 8.4.3 Graham'sScan 275
Closest Pair 278 Intersections of Horizontal and Vertical Line Segments 281
Summary 285 Bibliographie Notes and Further Reading 286
Exercises 287
Chapter 9 Algebraic and Numeric Algorithms 293
9.1 9.2 9.3 9.4 9.5 9.6 9.7 Introduction Exponentiation Euclid's Algorithm Polynomial Multiplication Matrix Multiplication 9.5.1 Winograd's Algorithm 9.5.2 Strassen's Algorithm 9.5.3 Boolean Matrices The Fast Fourier Transform Summary
Bibliographie Notes and Further Reading Exercises Chapter 10 Reductions 321 293 294 297 298 301 301 301 304 309 316 316 317 10.1 Introduction 321 10.2 Examples of Reductions 323
10.2.1 A Simple String-Matching Problem 323 10.2.2 Systems of Distinct Representatives 323 10.2.3 A Reduction Involving Sequence Comparisons 324
10.2.4 Finding a Triangle in Undirected Graphs 325 10.3 Reductions Involving Linear Programming 327
10.3.1 Introduction and Definitions 327 10.3.2 Examples of Reductions to Linear Programming 329
10.4 Reductions for Lower Bounds 331 10.4.1 A Lower Bound for Finding Simple Polygons 331
10.4.2 Simple Reductions Involving Matrices 333
10.5 Common Errors 334 10.6 Summary 336
Bibliographie Notes and Further Reading 336
Exercises 337 ChapterU NP-Completeness 341
11.1 Introduction 341 11.2 Polynomial-Time Reductions 342
11.3 Nondeterminism and Cook's Theorem 344 11.4 Examples of NP-Completeness Proofs 347
11.4.1 Vertex Cover 348 11.4.2 Dominating Set 348 11.4.3 3SAT 350 11.4.4 Clique 351 11.4.5 3-Coloring 352 11.4.6 General Observations 355
11.4.7 More NP-Complete Problems 356 11.5 Techniques For Dealing with NP-Complete Problems 357
11.5.1 Backtracking and Branch-and-Bound 358 11.5.2 Approximation Algorithms with Guaranteed
Performance 363
11.6 Summary 368 Bibliographie Notes and Further Reading 368
Exercises 370 Chapter12 Parallel Algorithms 375
12.1 Introduction 375 12.2 Models of Parallel Computation 376
12.3 Algorithms for Shared-Memory Machines 378
12.3.1 Parallel Addition 379 12.3.2 Maximum-Finding Algorithms 380
12.3.3 The Parallel-Prefix Problem 382 12.3.4 Finding Ranks in Linked Lists 385 12.3.5 The Euler's Tour Technique 387 12.4 Algorithms for Interconnection Networks 389
12.4.1 Sorting on an Array 390 12.4.2 Sorting Networks 393 12.4.3 Finding the Äth-Smallest Element on a Tree 396
12.4.4 Matrix Multiplication on the Mesh 398
xiv Contents 12.5 12.6 References Index Systolic Computation 12.5.1 Matrix-Vector Multiplication 12.5.2 The Convolution Problem 12.5.3 Sequence Comparisons Summary
Bibliographie Notes and Further Reading Exercises