1/4: Introduction, change-making algorithm with and without
change0.py, the original recursive program.
change1.py, the memoized version.
coinProof.pdf, my fourth version of the brief proof that memoization version uses 5n function calls.
Question to think about: Does the proof show that the memoization version uses exactly 5n function calls, or does it give an upper or lower bound?
Question to think about: Does the original version or the memoized version use more memory?
1/6: Analysis of coin changing, merge sort, beginning of analysis
of merge sort.
Merge sort is in Section 2.3 in the book.
Question to think about: We decided we could not get a bound on the running time by bounding the number of recursive calls. Use the Master Method to bound the number of recursive calls. Do you get the same asymptotic function as the one we got for the running time?
1/8: Proof by substitution, master
method. Introduction to randomized selection.
Proof by substitution is Section 4.1 and the Master Theorem is Section 4.3.
The sum we needed was
in Appendix A1. Randomized selection is in Section 9.2.
Here is Prof. Martel's handout on a
simplified version of the Master Theorem.
Question to think about: Our back-of-the envelope analysis assumed that we split the problem into two equal-sized sub-problems at each iteration. Do a back-of-the envelope analysis in which we assume (also incorrectly, but a little more probably) that we split the the problem into two sub-problems in which the size of the larger one is no more than three times the size of the smaller one.
1/11: Analyzing randomized algorithms. The hiring problem.
Probability facts. Sections 5.1 and 5.2, probability review in
Question to think about: Independence can be a tricky concept. Does getting more information change the probability or not? A classic example is the Monty Hall problem. I put three cards face down on the table, and offer you a fabulous prize if you guess which one is the ace of spades. You guess some card. Then I turn over one of the two cards that you didn't guess, and show you that it isn't the ace of spades. I tell you that if you want, you can change your guess. Should you?
1/13: Analysis of randomized selection. Finishing up Section 9.2.
1/15: Hashing, using chaining. How long can one chain get?
Sections 11.1 and 11.2.
Lecture notes on the length of the longest chain in a hash table.
Question to think about: In Section 11.2 they prove that the expected time to search for an item that is in the table is O(1). This implies an upper bound on the length of the longest chain; for instance, if the longest chain had length n then the expected time to search for a random item would be O(n). What is the best bound you can get on the length of the longest chain, based on the fact that the expected time to search for a random item is O(1)?
1/20: Finish up hashing. Demonstration of multiple-choice hashing.
Hashing using one hash function produces a distribution of chain lengths that looks like this:
Hashing using two hash functions produces a distribution like this:
1/22: Dynamic programming. Matrix sequence multiplication, Section 15.2.
Question to think about: We thought for a minute that we maybe we could get an optimal algorithm by always choosing the smallest matrix dimension in the seqence as the last dimension to multiply; for instance, if we have 3x1 1x2 2x3, the smallest dimension is one and the best choice would be 3x1 (1x2 2x3). Give a sequence of three matrices such that choosing the smallest dimension is not the best choice.
1/25: Properties of dynamic programming. A first cut at Longest Common
Subsequence. Sections 15.3 and the beginning of 15.4.
Question to think about: Consider the following recursive algorithm for Uweighted Simple Longest Path from u to v, using the notation of Section 15.3. For each vertex w, we consider solutions in which w is the last edge of the Longest Path, so that the path ends in edge ew,v connecting w to v. For each w adjacent to v, we remove v and all of its adjacent vertices from the graph and then find the Unweighted Simple Longest Path from u to w, recursively in the smaller graph, producing a path Pw. Then we take the maximum of length(Pw) + ew,v, over all choices of w, as the length of the longest path. What kind of an upper bound can you give for the running time of this algorithm, using memoization?
1/27: Longest Common Subsequence. End of Section 15.4.
1/29: All-pairs shortest paths. Section 25.2.
2/1: Dijkstra's algorithm. Section 24.3. Here are some lecture notes. They include a question to think about. A suggestion about reading these notes: try to draw a picture for every idea, especially the Essential Lemma. Make yourself a "comic book" version of the proof as it goes along. You could also try making yourself a small example for every Lemma.
2/3: Midterm 1.
2/5: Minimum spanning tree. Chapter 23.
2/8: Maintaining connected components. Section 21.1 and 21.2.
Question to think about: We argued that maintaining the connected components themseleves as rooted trees and keeping an auxillery array to store the root of the tree containing each vertex allowed us to implement Kruskal's algorithm in O(m lg n) time. Explain exactly how to merge together the two rooted trees when two components are connected by a new edge.
2/10: Amortized analysis using a potential function. Sections 17.3 and 17.4.
Question to think about: Check that deletions always have an amortized cost of at most three.
2/12: Disjoint sets data structure, the rank function, and
Here are some Prof. Trevisan's lecture notes, from Berkeley, giving the simpler proof that we will cover.
2/17: Finish disjoint sets analysis.
2/19: Huffman encoding. Section 16.3.
2/22: More Huffman encoding, introduction to entropy.
2/24: Sorting lower bound, begin entropy lower bound. Section 8.1.
2/26: The entropy lower bound. Lecture notes to appear here soon.
3/1: Intro to NP-completeness. Sections 34.1 and 34.3.
3/3: Midterm 2.
3/5: Checkability and NP-completeness. Section 34.2. 3/8: NP-complete problems. Section 34.5.