Course Topics Course introduction and objectives How to be an A student Review of logs and other functions Summing geometric and arithmetic series Useful formulae Order notation Divide and conquer Sorting (bubble sort, insertion sort, merge sort) Solving recurrences (several different approaches) Recurrences for (searching on a binary tree, computing $a^n$, binary search) Repeated doubling Matrix multiplication (iterative, divide-and-conquer, improvements such as Strassen) Circuit Addition (Upper and lower bounds, nonunique representation) Using induction to prove that we have the correct solution to a recurrences More mathematical preparation for linear-time selection Quicksort W.h.p analysis Randomized and deterministic Linear-time selection Dynamic programming (knapsack problem, edit distance, edit distance with small space, finding line breaks in a document, etc) Shortest Paths (in a dag, singlesource, all pairs) Handouts for: Minimum spanning trees (Prims, Kruskalls, Borovka) Viewing DP as path-finding in a DAG. Amortization (how it helps hashing, weight-balanced search trees) 2-3 trees other trees Skip lists van Emde Boas Trees Karp-Rabin string matching Computing to achieve cache-and I/O-efficiency B-trees Matrix multiplication Blocking and Space filling curves Cache-oblivious algorithms Multi-way mergesort Write optimization NP-completeness and hardness Reductions