This course presents principles and techniques for design and analysis of computer algorithms, in order for students to gain theoretical and systematic insight into real problems that arise in computer applications. (Students are required to code some existing algorithms aiming at experiencing practical aspects of implementing algorithms on an abstract level.) Students learn to reason about algorithms at an abstract cevel, and experience the practical aspects of implementing an abstract algorithm.