Introduction to algorithms I. Foundations. The role of algorithms in computing Getting started Growth of functions Divide and conquer Probabilistic analysis and randomized algorithms II. Sorting and order statistics. Heapsort Quicksort Sorting in linear time Medians and order statistics III. Data structures. Elementary data structures Hash tables Binary search trees Red black trees Augmenting data structures IV. Advanced design and analysis techniques. Dynamic programming Greedy algorithms Amortized analysis V. Advanced data structures. B trees Fibonacci heaps van Emde Boas trees Data structures for disjoint sets VI. Graph algorithms. Elementary graph algorithms Minimum spanning trees Single source shortest paths All pairs shortest paths Maximun flow VII. Selected topics. Multithreaded algorithms Matrix operations Linear programming Polynomials and the FFT Number theoretic algorithms String matching Computational geometry NP completeness Approximation algorithms VIII. Appendix: Mathematical background. Summations Sets etc. Counting and probability Matrices