Examines object-oriented programming and associated algorithms using common data structures as the focus.

Discusses nested structures and non-linear structures, such as stacks, queues, linked lists, trees, heaps, maps, and graphs. Emphasizes abstraction, encapsulation, inheritance, polymorphism, recursion, and object-oriented design patterns.

These concepts are applied to solve common practical computer science problems. A weekly laboratory period provides guided hands-on experience.
Introduces the systematic study of algorithms and their analysis with regard to time and space complexity. Topics include divide-and-conquer, dynamic programming, greediness, randomization, upper and lower-bound analysis, and introduction to NP completeness. Emphasis is placed on general design and analysis techniques that underlie algorithmic paradigms. Builds a foundation for advanced work in computer science.