This course provides an design and analysis of algorithms. The main focus lies on techniques for constructing correct efficient algorithms and on tools to reason about them. Design paradigms include greed, divide-and-conquer, dynamic programming, reductions, and randomness. A second focus point is computational intractability. NP-complete problems are covered, as well as ways to deal with them.
The course forms a foundation for all areas of computer science. The particular computational problems discussed have applications in artificial intelligence, computational biology, compiler construction, hardware and network protocols, and optimization.