Every day around the world, billions of people listen to music of one sort or another, and millions listen to Western classical music. Why do we do it? Because it’s fun? Because it energizes or relaxes us? Because it keeps us current, allows us to understand what’s happening in past and popular culture? The pull of music–especially classical music—has never been explained. The aim of this course is to do just that: To explicate the mysteries and beauties of some of Western cultures greatest musical compositions—among them masterpieces of Bach, Mozart, Beethoven, Wagner, and Puccini.
In this course you will learn several fundamental principles of algorithm design. You'll learn the divide-and-conquer design paradigm, with applications to fast sorting, searching, and multiplication. You'll learn several blazingly fast primitives for computing on graphs, such as how to compute connectivity information and shortest paths. Finally, we'll study how allowing the computer to "flip coins" can lead to elegant and practical algorithms and data structures.