Algorithm design and analysis is a fundamental and important part of computer science. This course introduces students to advanced techniques for the design and analysis of algorithms, and explores a variety of applications.
We will focus primarily on the use of randomness in algorithm design. We tentatively plan to cover the following aplications/topics: hashing, bloom filters, randomized rounding, online load balancing, algorithms in machine learning, Markov chains and the MCMC method, counting, byzantine agreement, and internet algorithms.
Our primary text is Michael Mitzenmacher and Eli Upfal, Probability and Computing, Cambridge University Press, 2005. Other useful references are:
One undergraduate course in algorithms (577) or complexity (520, 810, or 830) is required. If you are unsure of whether you have sufficient background for this course or not, please contact the instructor within the first week.
Grading & Evaluation
Homework and exams: There will be 2 homeworks and one take-home final (25% each). The homework can be done in pairs; the take-home final must be done individually.
Course project: Projects are to be done in groups of two (or, by permission of the instructor, alone). Roughly mid-semester, each group should pick a topic of choice related to the course, get it approved from the instructor, and perform self-study of a few papers or chapters related to the topic. Groups are expected to prepare a report of 4-8 pages as well as make a 20-minute presentation on their project to the instructor towards the end of the semester. The class project counts towards 25% of your final score.