The course covers main concepts and principles of the design and analysis of algorithms. It begins with a thorough introduction of the rates of growth of functions followed by the techniques to solve recurrence relations. These techniques are used to evaluate the running time of various algorithms. Among the computational problems covered are dynamic programming and greedy algorithms, graph algorithms, string matching and NP-completeness.