Overview: in this course we will study the heart of computer science: computation. What can be computed, and how? How long does it take? How can it be done more efficiently? The design and analysis of algorithms is fundamentally what a computer scientist does as computer scientist. (But don't let a software engineer hear you say that.)

In this course we will study a number of data structures and algorithms that are commonly used. We will learn to analyze algorithms for asymptotic runtime and other properties. We will spend a bit of energy also on algorithm design techniques. The areas we will concentrate on are advanced data structures, algorithms analysis, trees and graphs, UI toolkits, and intelligent systems. We may make forays into areas such as fractals, pattern matching, and data compression.