This course covers the principles of algorithm design and analysis. Different approaches to design such as divide and conquer, greedy, and dynamic programming are covered. Advanced data structures beyond the basic lists, stacks and trees are also introduced such as red-black and AVL trees. Proving the correctness of algorithms and analysis using advanced techniques such as the master theorem are covered. Tractability of algorithms is discussed including NP-Completeness.