Week 1:
Jan 7: Introduction, Order notation, Growth of functions:
    Introduction to Running time analysis [Sec 2.2]
    Asymptotic notation (Big oh, Theta, Omega) and the
    limit method for determining O/Theta/Omega [Sec 3.1]
    Summations of arithmetic and geometric series [Appendix A]
    Approximation by integrals [Appendix A]

Jan 9: Recurrences and Solution techniques
    Iteration method, Substitution method, Recursion tree method,
    Master method, Applications of Master method [Chapter 4].
    Bounding summations: upper bound by bounding each term, and lower
    bound by splitting the sum and bouding the upper half [Appendix A.2].

Week 2:
Jan 14 Divide-and-conquer method:
    Merge sort and Quick sort algorithms,
    Loop invariants to prove correctness of Merge and Partition functions,
    Finding Min and Max of an array using 1.5n-2 comparisons,
    Multiplication of two n-bit numbers: trivial method: O(n^2).
    Obvious divide-and-conquer algorithm also takes O(n^2).
    Next class: a better DAC algorithm.

Jan 16 O(n^{log 3}) algorithm for multiplication
    of two n-bit numbers.  More examples of divide-and-conquer:
    Sorting networks (Ch 27), 0/1 principle, bitonic sequences,
    bitonic half-cleaner, bitonic sorter, merger, sorting network.
    Polynomial multiplication and FFT algorithm (Ch 30).

Week 3:
Jan 23 Selection problem of finding the k-th
    smallest element of a given array, O(n) randomized algorithm for Select,
    O(n) deterministic algorithm for Select, Quick overview of
    linear-time sorting algorithms (Counting, Radix, Bucket).

Week 4:
Jan 28 Dynamic programming (Dr. Chandrasekaran)
Jan 30 Dynamic programming (Dr. Chandrasekaran)

Week 5:
Feb 04 Dynamic programming (Dr. Chandrasekaran)

Feb 6 Discussion of Assignment 1, Omega(n log n) lower bound for comparison-based sorting.

Week 6:
Feb 11: Review.
Feb 13: Exam 1.

Week 7:
Feb 18 Dynamic programming: knapsack problem.  Activity selection problem: DP and greedy algorithm.

Feb 20 Proof techniques: induction, contradiction.

Week 8:
Feb 25 Loop invariants for proving correctness of loops.
    Correctness of linear search, binary search, partition procedure.

Feb 27 Introduction to graphs.  Depth-first search (DFS),
    Sample run to find topological ordering of a DAG, Properties of DFS.

Week 9:
Mar 3 Correctness of topological sorting algorithm, Strongly connected components.

Mar 5 Correctness of Strongly connected components algorithm, finding bridges and cut vertices using DFS.

Week 10:
Mar 17: Review
Mar 19: Exam 2

Week 11:
Mar 24 Shortest path problem; optimal substructure property of shortest paths.
    Recurrences and DP algorithms for all-pairs shortest paths.

Mar 26 Floyd-Warshall's algorithm for APSP.  Sample execution.

Week 12:
Mar 31 Single source shortest paths: Bellman-Ford algorithm, proofs of correctness, DAG-shortest paths.

Apr 2 Single source shortest paths: Dijkstra's algorithm, Breadth-first search (BFS).

Week 13:
Apr 7 Minimum spanning trees; generic MST algorithm and its correctness.  Implementation of Prim's and Kruskal's algorithms.

Apr 9 Union/Find Analysis, Maximum flow problem: Ford-Fulkerson's algorithm.

Week 14:
Apr 14 Proof of max-flow min-cut theorem, Extensions and applications of max-flow problem.

Apr 16 Bipartite matching problem, NP-completeness.

Week 15:
Apr 21 NP-completeness proofs: Clique, Independent set, Vertex cover,

Apr 23 Hamiltonian cycle, TSP, Subset sum (from book). Approximation algorithms for VC and TSP.

Week 16:
Apr 28 Final exam review.