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:

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 learn how to follow this process to design, analyze, and communicate precisely about algorithms. They will also learn about several algorithmic paradigms, including greedy algorithms, divide and conquer, dynamic programming, and network flow algorithms.

Finally, in some cases, the designer cannot find any efficient algorithm that solves the problem. Students will also learn the theory of NP-completeness and computational intractability, which lets them prove that certain problems are intractable.

Basic Information

Instructor Dan Sheldon
dsheldon (at) mtholyoke (dot) edu
Lecture Tuesday, Thursday, 10:00am–11:15pm
Fourth Hour Friday 10:00–10:50 am
Location Shattuck 216
Gradescope https://gradescope.com/courses/10526
Piazza https://piazza.com/mtholyoke/fall2017/cs312/home
Moodle https://moodle.mtholyoke.edu/course/view.php?id=11875
Textbook Kleinberg and Tardos, Algorithm Design, Addison-Wesley, 2006
Office Hours 12:30-1:30 Tuesday and Thursday, Clapp 200. Or by appointment.
TAs Vivian Le and Kaya Ni
TA office hours Wednesday 7–9pm, Thursday 7:30–9:30pm