Algorithm Design and Analysis :: CS 256 :: Spring 2016


announcements :: homework :: lectures

Contact Information

Professor: Brent Heeringa
Email: heeringa [at] cs [dot] williams [dot] edu
Office: Thompson Chemistry Laboratory 306
Phone: 413.597.4711

Course Information

Course Classroom: Schapiro 129
Course Time: 10.00 - 10.50
Office Hours: Monday evenings from 20.00-22.00; Tuesday mornings 10.30-12.00
Teaching Assistant: Kai Wang, Alexis Savery, Diwas Timilsina Teaching Assistant Office Hours: Kai: Tuesdays 21.00-23.00 :: Alexis: Tuesdays 19.00-21.00 :: Diwas: Mondays 22.00-00.00
Course Text: Algorithm Design by Jon Kleinberg and Éva Tardos. The text is available at Water Street Books or online

Course Description

From the course catalog:

This course investigates methods for designing efficient and reliable algorithms. By carefully analyzing the structure of a problem within a mathematical framework, it is often possible to dramatically decrease the computational resources needed to find a solution. In addition, analysis provides a method for verifying the correctness of an algorithm and accurately estimating its running time and space requirements. We will study several algorithm design strategies that build on data structures and programming techniques introduced in Computer Science 136. These include induction, divide-and-conquer, dynamic programming, and greedy algorithms. Particular topics of study include graph theory, hashing, network flow, and advanced data structures.

We all have problems. This course is not only about finding solutions to the problems, but rather, provably good solutions. We begin by developing techniques for algorithm analysis---mathematical methods for putting bounds on the time and the space complexity of algorithms. We'll study asymptotic analysis, recurrence relations, and some probability theory. Next, we'll delve into problem solving strategies like divide and conquer, greedy methods, and dynamic programming. Now that we've got some practice solving problems and analyzing our solutions, we'll try our hand at some algorithms on advanced data structures like graphs and balanced trees. Probing further we'll learn some advanced algorithm design techniques like linear programming andthe fast Fourier transforms. Finally, we'll look at a class of problems for which no known polynomial time solutions exist. We'll talk about ways of identifying these seemingly different problems, and proving that they are all, in some way, intimately related.

Course Grading

Here is the breakdown:

Some points of clarification:

A few notes on the midterm:

Course Announcements

Course Lectures

The following lecture schedule is tentative. It may change based on current events, class interests and progress, and my own whims. Note that lecture notes are not available for download. This is on purpose. I very much want you to create your own set of notes from lecture and not rely on mine.

Course Homework

Course Links and Ephemera