have a good understanding of how several fundamental
algorithms work, particularly those concerned with sorting, searching
and graph manipulation

have a good understanding of the fundamental data structures used
in computer science

be able to analyse the space and time efficiency of most algorithms

be able to design new algorithms or modify existing ones for new
applications and reason about the efficiency of the result

Recommended reading

* Cormen, T.H., Leiserson, C.D., Rivest, R.L. & Stein, C. (2001). Introduction to Algorithms. MIT Press (2nd ed.). ISBN 0-262-53196-8
Sedgewick, R. (2004). Algorithms in Java. (2 volumes; note that C and C++ editions are also available and are equally good for this course). Addison-Wesley. ISBN 0-201-36120-5 and 0-201-36121-3.
Kleinberg, J. & Tardos, É. (2006). Algorithm design. Addison-Wesley. ISBN 0-321-29535-8.
Knuth, D.E. (1997). The art of computer programming (three volumes so far; a boxed set is also available). Addison-Wesley (3rd ed.). ISBN 0-201-89683-4, 0-201-89684-2 and 0-201-89685-0.

Students are expected to buy and make extensive use of one of the
above references: those not doing so will be severely
disadvantaged. The easiest and recommended choice is Cormen et al. which
covers all the topics in the syllabus: the pointers in the syllabus
are to chapters in that book. The other textbooks are all excellent
alternatives and are sometimes clearer or more detailed than Cormen,
but they are not guaranteed to cover every item in the syllabus. Their
relative merits are discussed in the course handout.