This book provides a thorough introduction to the primary techniques used in the mathematical analysis of algorithms. The authors draw from classical mathematical material, including discrete mathematics, elementary real analysis, and combinatorics, as well as from classical computer science material, including algorithms and data structures. They focus on 'average-case' or 'probabilistic' analysis, although they also cover the basic mathematical tools required for 'worst-case' or 'complexity' analysis. Topics include recurrences, generating functions, asymptotics, trees, strings, maps, and an analysis of sorting, tree search, and hashing algorithms.