How can we be confident that an algorithm is correct before we implement it? How can we compare the efficiency of different algorithms? We present rigorous techniques for design and analysis of efficient algorithms. We consider problems such as sorting, searching, graph algorithms, and string processing. Students will learn design techniques such as linear programming, dynamic programming, and the greedy method, as well as asymptotic, worst-case, average-case and amortized runtime analyses. Data structures will be further developed and analyzed. We consider the limits of what can be efficiently computed. May be elected as Computer Science 327, and must be elected as Computer Science 320 to apply toward the total credit requirement in Computer Science.
Computer Science 270; and Computer Science/Mathematics 220 or Mathematics 260.