This course introduces basic data structures and algorithms which are necessary for virtually any programming task. We discuss elementary and structured data types such as lists, stacks, queues, trees and sets and review basic algorithms for searching, sorting, hashing and graph analysis. We study techniques for determining the efficiency of a given algorithm. In the last week we will give an introduction to Java.