Problem solving is an essential part of every scientific discipline. It has two components: (1) problem identification and formulation, and (2) solution of the formulated problem. One can solve a problem on its own using ad hoc techniques or follow those techniques that have produced efficient solutions to similar problems. This requires the understanding of various algorithm design techniques, how and when to use them to formulate solutions and the context appropriate for each of them. This book advocates the study of algorithm design techniques by presenting most of the useful algorithm design techniques and illustrating them through numerous examples.Contents: Basic Concepts and Introduction to Algorithms:Basic Concepts in Algorithmic AnalysisMathematical PreliminariesData StructuresHeaps and the Disjoint Sets Data StructuresTechniques Based on Recursion:InductionDivide and ConquerDynamic ProgrammingFirst-Cut Techniques:The Greedy ApproachGraph TraversalComplexity of Problems:NP-Complete ProblemsIntroduction to Computational ComplexityLower BoundsCoping with Hardness:BacktrackingRandomized AlgorithmsApproximation AlgorithmsIterative Improvement for Domain-Specific Problems:Network FlowMatchingTechniques in Computational Geometry:Geometric SweepingVoronoi DiagramsReadership: Senior undergraduates, graduate students and professionals in software development.Key Features:Provides a comprehensive overview of the methods used in the analysis of PLLsMathematical tools are presented to describe and illustrate the properties of PLLs