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. Binary Search
  6. Divide and Conquer: MergeSort + Recurrences
  7. Divide and Conquer: Finding Top-k elements of an array
  8. Divide and Conquer: Finding Median in Linear Time
  9. Divide and Conquer: Counting Inversions
  10. Divide and Conquer: Karatsuba's Algorithm
  11. Divide and Conquer: Polynomial Multiplication via Fast Fourier Transform
  12. Divide and Conquer: Closest Points on a Plane
  13. Dynamic Programming: Smart Recursion
  14. Dynamic Programming: Subset Sum and Knapsack
  15. Dynamic Programming: Edit Distance
  16. Dynamic Programming: Longest Increasing Subsequence
  17. Dynamic Programming: When doesn't it work?

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