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

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

- Textbook
- Jon Kleinberg and Éva Tardos, Algorithm Design, Addison-Wesley, 2006.