Algorithms (PDF)
These notes are primarily written for anyone studying algorithms at a standard undergraduate level. They assume familiarity with fundamental programming concepts (e.g., arrays, loops), discrete math (e.g., basic set theory, graphs), and asymptotic notation. For a more thorough treatment of the material, I recommend the following textbooks. I think they are all very well written, and these notes draw heavily from them.
- Algorithms by Dasgupta, Papadimitriou, and Vazirani
- Algorithms by Erickson
- Algorithm Design by Kleinberg and Tardos
- Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein
Theory of Computation (PDF)
These notes are primarily written for anyone studying from the book Introduction to the Theory of Computation by Michael Sipser, specifically the third edition. (In these notes, whenever I refer to "the book," I am referring to that book.) I think the book is excellent, and I strongly recommend it. When writing these notes, I also consulted other resources, most notably the following, which I also recommend:
- Introduction to Theoretical Computer Science by Barak
- Models of Computation by Erickson