At the end of this course, the student will learn:

- review of basic concepts of analysis of algorithms
- review of important algorithms
- lower and upper bound teory concepts and proof of them
- a number of algorithm design approaches, such as divide and conquer, greedy design technique, dynamic programming, backtracking, branch and bound design tecniques
- amortized analysis
- NP-Complete and NP-Hard Problems
- Proof of NP-Completeness and Reducibility
- Approximation Algorithms