Introduction, Growth of Functions, 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, Lower bound theory; NP-completeness, NP-hard and NP-complete problems.