Techniques for analysis of algorithms; Methods for the design of efficient algorithms: divide and conquer, greedy method, dynamic programming, back tracking, branch and bound; Basic search and traversal techniques; Topological sorting; Connected components, spanning trees, shortest paths; Flow algorithms; Approximation algorithms; Parallel algorithms; Algebraic simplification and transformations; Lower bound theory; NP-completeness, NP-hard and NP-complete problems.