This course covers the principle of algorithm design, analysis, and implementation. The course concentrates on computational problems such as searching, sorting algorithms and algorithms on graph data. Main algorithmic paradigms such as divide-and-conquer, randomized algorithms, greedy design, and dynamic programming are discussed based on covered computational problems. Implementation language for the in class examples and homeworks is C++.