Lecture Notes on Undergraduate Algorithms

A first course on undergraduate algorithms taught at Dartmouth

  1. Introduction, Worst Case Run Times
  2. Communicating Algorithms
  3. Big-Oh Notation
  4. Algorithms with Numbers
  5. Divide and Conquer: MergeSort + Recurrences
  6. Divide and Conquer: Finding Top-k elements of an array
  7. Divide and Conquer: Counting Inversions
  8. Divide and Conquer: Karatsuba's Algorithm
  9. Divide and Conquer: Polynomial Multiplication via Fast Fourier Transform
  10. Divide and Conquer: Closest Points on a Plane
  11. Dynamic Programming: Smart Recursion
  12. Dynamic Programming: Subset Sum and Knapsack
  13. Dynamic Programming: Edit Distance
  14. Dynamic Programming: Longest Increasing Subsequence
  15. Dynamic Programming: When doesn't it work?

  16. Graphs: Depth First Search + Properties
  17. Graphs: Topological Sort + Applications
  18. Graphs: Strongly Connected Components via DFS
  19. Graphs: Breadth First Search + Dijkstra's Algorithm
  20. Graphs: Bellman-Ford Algorithm for Detecting Negative Cycles
  21. Graphs: Flows and Cuts
  22. Graphs: Ford-Fulkerson Algorithm for Max-Flow and Min-Cut
  23. Graphs: Ford-Fulkerson Algorithm for Max-Flow and Min-Cut
  24. Graphs: Issue with Ford-Fulkerson
  25. Graphs: Faster Flow Algorithms
  26. Graphs: Applications of Flows and Cuts
  27. Graphs: Boruvka's Algorithm for Minimum Spanning Tree
  28. Graphs: Prim and Kruskal's Algorithm for MST
  29. Linear Programming
  30. Hardness