CS 312: Algorithms
Algorithm design is a fundamental intellectual undertaking of computer science. Before writing a computer program to solve a complex problem such as routing packets on the Internet, computing the similarity between two DNA sequences, or scheduling final exams at a university, a computer scientist must first design an algorithm. The typical design process consists of:
- Formulating a mathematically clean problem definition
- Proposing an algorithm
- Proving that it correctly solves the problem
- Analyzing its running time
Each of these steps is done with a high-level description of the problem and algorithm, before writing a single line of code! In this class, students will practice these steps and learn several fundamental patterns of algorithm design, including greedy algorithms, divide and conquer, dynamic programming, and network flows.
In some cases, the designer cannot find any efficient algorithm that solves the problem. Another important part of the design process is proving that some problems are intractable. Students will also learn the theory of NP-completeness and computational intractability.
- Meeting times:
- Tuesday, Thursday 8:35–9:50 a.m.
- Monday, 3:15–4:05 p.m. (fourth hour)
- Clapp 126
- Jon Kleinberg and Éva Tardos, Algorithm Design, Addison-Wesley, 2006.