This course will consider the techniques for the design and analysis of
efficient algorithms, emphasizing methods useful in practice. Topics
will include sorting; search trees, heaps, and hashing;
divide-and-conquer; dynamic programming; greedy algorithms; amortized
analysis; graph algorithms; and shortest paths. Other topics may include
network flow, computational geometry, number-theoretic algorithms,
polynomial and matrix calculations, caching, and parallel computing.