This course focuses on data structures and algorithm design. Data design topics include object-oriented discussions of hashing, advanced tree structures, graphs, and sets. Algorithm design topics include the greedy, divide-and-conquer, dynamic programming, backtracking, and branch-and-bound techniques. A significant discussion of algorithm complexity theory, including time and space trade-offs and elementary computability theory is included. Students should be able to use the Standard Template Library. Be able to know when and use various data structures including, hash tables, sets, priority queues, binary trees, search trees and graphs. Be able to design and document small programs. Be able to design algorithms using greedy, divide and conquer, dynamic programming, backtracking and branch and bound techniques.