These are lecture notes that I wrote for various algorithms classes at the University of Illinois at Urbana-Champaign, which I have taught on average once a year since January 1999. The most recent revision of these notes (or nearly so) is available online at http: //, along with a near-complete archive of all my past homeworks and exams. Whenever I teach an algorithms class, I revise, update, and sometimes cull these notes as the course progresses, so you may find more recent versions on the web page of whatever course I am currently teaching.

With few exceptions, each of these "lecture notes" contains far too much material to cover in a single lecture. In a typical 75-minute class period, I cover about 4 or 5 pages of material—a bit more if I’m teaching graduate students than undergraduates. Moreover, I can only cover at most two-thirds of these notes in any capacity in a single 15-week semester. Your mileage may vary! (Arguably, that means that as I continue to add material, the label "lecture notes" becomes less and less accurate.) I teach algorithms at multiple leaves; different courses cover different but overlapping subsets of this material. The ordering of the notes is mostly consistent with my lower-level classes, with more advanced material (indicated by * stars) inserted near the more basic material it builds on. The actual material doesn’t permit a strict linear ordering, but I’ve tried to keep forward references to a minimum