This course covers fundamental algorithm design principles and data structures, basic notions of complexity theory, as well as an advanced introduction to parallel algorithms, randomized algorithms, and approximation algorithms. Topics include: divide-and-conquer, dynamic programming, amortized analysis, graph algorithms, network flow, map reduce, and more advanced topics in approximation algorithms and randomized algorithms. Satisfies the algorithm breadth area requirement.