### Computer Science 212

# Data Structures and Algorithms

**Instructor**: Harry Plantinga

**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.

**Course outcomes:**

Students successfully completing this course will demonstrate
the ability to:

- Analyze the runtime of non-recursive and recursive algorithms using asymptotic
notation
- Use or explain the use of data structures including balanced trees, hash tables, and graphs
- Use or explain the use of basic algorithms including sorting, graph algorithms, and AI search
techniques such as minimax and A* search
- Use and explain the use of algorithm design techniques including greedy, divide and conquer, and
dynamic programming to design algorithms
- Discuss ethical issues on algorithms

**Course practices:**

- Lectures
- Tests
- Written homework
- Programming projects