Course Overview

If you liked, for example, the argument about why the local and greedy algorithm correctly finds the global minimum spanning tree in a weighted graph, then this course should be of interest to you. The course will cover systematic and analytic techniques for dealing with a variety of types of algorithmic problems, designing efficient and correct algorithms for them, comparing them with other algorithms, and convincing yourself of their correctness as well as efficiency or complexity. While any algorithmic technique begins as adhoc ingenuity, the emphasis in this course is to extract the essence of what makes the technique work, and to apply it to as broad a class of problems as possible, and thereby make science out of it: systematic as opposed to adhoc techniques. The problems and algorithms discussed in this course affect just about every area of computer science. The course would develop an ability to think clearly about algorithmic problems and abstractly approach them, which in turn directly affects speed at writing clear, efficient and correct code. This course will additionally build your intuition for representative and practically interesting problems in various complexity classes. In other words, it will further your intuition as to ``what gives this specific problem this particular level of difficulty or complexity and what inherently differentiates it from another specific problem of higher or lower complexity?''