Fundamental paradigms of algorithms and data structure design. Divide and conquer, dynamic programming, greedy method, graph algorithms, amortization, priority queues and variants, search structures, disjoint-set structures. Examples from various problem domains.