This course covers analysis of efficient algorithms for sorting, searching, dynamic structure manipulation, path- finding, fast multiplication, and other problems. It introduces algorithmic techniques such as recursion, divide- and-conquer, and dynamic programming. It develops the followin tools for algorithmic analysis: correctness proofs, algorithm synthesis, and discusses issues in non- computability. This course also overviews non-deterministic algorithms, and develops techniques to classify computationally hard problems. The concept of non- dterministic polynomial (NP)-completeness is introduced, and basic issues related to NP-completeness are discussed. Prerequisites: COMP 280, MATH 131. (F;S;SS)