From the course catalog:
This course investigates methods for designing efficient and reliable algorithms. By carefully analyzing the structure of a problem within a mathematical framework, it is often possible to dramatically decrease the computational resources needed to find a solution. In addition, analysis provides a method for verifying the correctness of an algorithm and accurately estimating its running time and space requirements. We will study several algorithm design strategies that build on data structures and programming techniques introduced in Computer Science 136. These include induction, divide-and-conquer, dynamic programming, and greedy algorithms. Particular topics of study include graph theory, hashing, network flow, and advanced data structures.
We all have problems. This course is not only about finding solutions to the problems, but rather, good solutions--meaning provably good solutions. We begin by developing techniques for algorithm analysis--mathematical methods for putting bounds on the time and the space complexity of algorithms. We'll study asymptotic analysis, recurrence relations, and some probability theory. Next, we'll delve into problem solving strategies like divide and conquer, greedy methods, and dynamic programming. Now that we've got some practice solving problems and analyzing our solutions, we'll try our hand at some algorithms on advanced data structures like graphs and balanced trees. Probing further we'll learn some advanced algorithm design techniques like linear programming and maybe the fast Fourier transforms. Finally, we'll look at a set of problems for which no known polynomial time solutions exist. We'll talk about ways of identifying these seemingly different problems, and proving that they are all, in some way, intimately related.
Here is the breakdown:
I will reward insightful commentary on how you have thought about a question or why you cannot come up with an answer. In other words, telling me why and how you got stuck may earn you 2-3 points. Please do this!
- 5: The solution is clear and correct. This solution would easily find a home in a research paper.
- 4: The solution contains a few mistakes, but they are mostly arithmetic or of little significance to the overall argument.
- 3: The solution hits on the main points, but has at least one logical gap.
- 2: The solution contains several logical mistakes, but parts of it are salvageable.
- 1: The solution is just plain wrong.
- 0: No attempt is made at solving the problem.