This course is concerned with the design and analysis of efficient computer algorithms. What constitutes efficiency and how it is measured are two of the topics which will be discussed early in the semester. After that we will approach the subject by investigating some of the most well-known and effective non-numeric algorithms and the methods of design that they illustrate. While efficient solutions to many important computational problems will be presented, the goal is not to be encyclopedic but rather to learn how one attempts to apply general principles in order to create effective programs. Of course an algorithm is not of much use unless we are certain that it solves the problem for which it was designed. Thus verifying the correctness of the algorithms we investigate will be of central importance in the course. Then, after each algorithm is designed and 'debugged' (that is, proven correct), we will be interested in measuring its efficiency.
Prerequisites: CSCI 136, Data Structures and Advanced Programming, and Math 251, Discrete Mathematics.