The course is about learning and practicing principles for organizing your thinking when solving programming problems, and not about memorizing details and facts. You must practice ways of establishing that an algorithm is correct and anlyzing its time bound. Getting good at these skills will allow you to come up with efficient algorithms of your own. You will also learn to recognize what kinds of optimizations on a program are a waste of time, as they will have little or no impact on the running time of the program as a whole.
Examples of problems will be taken from graph theory, computational geometry, design of sophisticated data structures, reductions of problems to linear programming and network flows, NP-completeness. You will become fluent at a variety of tricks and techniques for designing and analyzing algorithms.