Methods and techniques in the design and analysis of algorithms. Different algorithm design paradigms are discussed, such as divide-and-conquer, dynamic programming, and greedy algorithms. The complexity of the algorithms is analyzed and compared against brute-force algorithms using asymptotic notation. Other topics include The Master Method, graph algorithms, and an introduction to the theory of computation.