# The Algorithm Design Manual

Language: English

Pages: 730

ISBN: 1848000693

Format: PDF / Kindle (mobi) / ePub

Most professional programmers that I’ve encountered are not well prepared to tackle algorithm design problems. This is a pity, because the techniques of algorithm design form one of the core practical technologies of computer science. Designing correct, efficient, and implementable algorithms for real-world problems requires access to two distinct bodies of knowledge: • Techniques – Good algorithm designers understand several fundamental algorithm design techniques, including data structures, dynamic programming, depth first search, backtracking, and heuristics. Perhaps the single most important design technique is modeling, the art of abstracting a messy real-world application into a clean problem suitable for algorithmic attack. • Resources – Good algorithm designers stand on the shoulders of giants. Rather than laboring from scratch to produce a new algorithm for every task, they can figure out what is known about a particular problem. Rather than re-implementing popular algorithms from scratch, they seek existing implementations to serve as a starting point. They are familiar with many classic algorithmic problems, which provide sufficient source material to model most any application. This book is intended as a manual on algorithm design, providing access to combinatorial algorithm technology for both students and computer professionals.

although we recommend other implementations as a better basis for further development. My (biased) preference in C language graph types is the library from my book Programming Challenges [SR03]. See Section 19.1.10 for details. Simple graph data structures in Mathematica are provided by Combinatorica [PS03], with a library of algorithms and display routines. See Section 19.1.9. Notes: The advantages of adjacency list data structures for graphs became apparent with the linear-time algorithms

Graphs defined by road networks, printed circuit board layouts, and the like are inherently planar because they are completely defined by surface structures. Planar graphs have a variety of nice properties that can be exploited to yield faster algorithms for many problems. The most important fact to know is that every planar graph is sparse. Euler’s formula shows that |E| ≤ 3|V| − 6 for every nontrivial planar graph G = (V,E). This means that every planar graph contains a linear number of edges,

of the distances to three given points. This was solved by Torricelli before 1640. Steiner was apparently one of several mathematicians who worked the general problem for n points, and was mistakenly credited with the problem. An interesting, more detailed history appears in [HRW92]. Gilbert and Pollak [GP68] first conjectured that the ratio of the length of the minimum Steiner tree over the MST is always ≥ √3/2 ≈ 0.866. After twenty years of active research, the Gilbert-Pollak ratio was finally

be close-to-but-not-quite equidistant to two boundary edges. Since you are trying to do continuous geometry in a discrete world, there is no way to solve the problem completely. You just have to live with it. Implementations: CGAL (www.cgal.org) includes a package for computing the straight skeleton of a polygon P. Associated with it are routines for constructing offset contours defining the polygonal regions within P whose points are at least distance d from the boundary. VRONI [Hel01] is

processed finds a topological sort of a DAG. Why? Consider what happens to each directed edge {x, y} as we encounter it exploring vertex x: If y is currently undiscovered, then we start a DFS of y before we can continue with x. Thus y is marked completed before x is, and x appears before y in the topological order, as it must. If y is discovered but not completed, then {x, y} is a back edge, which is forbidden in a DAG. If y is processed, then it will have been so labeled before x.