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 Monday, Wednesday, 2:55–4:10pm
Fourth Hour Friday 2:55pm–3:45pm
Location Clapp 306
Gradescope https://www.gradescope.com/courses/24675
Piazza https://piazza.com/mtholyoke/fall2018/cs312/home
Moodle https://moodle.mtholyoke.edu/course/view.php?id=13794
Textbook Kleinberg and Tardos, Algorithm Design, Addison-Wesley, 2006
Office Hours Monday 4:10–5:10pm, Clapp 200
Wednesday 12:15–1:15pm, Clapp 200
TAs Vivian Le, Jessica Feng, Nhu Do, Steven Hill
TA office hours Tuesday 7–9pm, Clapp 206 (Jessica)
Wednesday 7–9p, Clapp 206 (Nhu and Vivian)