Course Description

The purpose of the course is to study how to design and analyze computer program algorithms to solve real-world problems. The course will begin with a review of the concept of algorithm complexity and basic graph algorithms; and then cover algorithm design approaches such as greedy, divide and conquer, and dynamic programming; then, a network flow problem will be introduced and algorithm design by reduction to a network flow problem will be discussed; then, the notion of problem reduction will be used to discuss and prove the computational intractability (i.e., hardness) of a problem; time permitting, approaches to handling intractable problems, such as approximation algorithms and local search algorithms, will be discussed as well.


Course Learning Objectives

After completing this course the student will be able to abstract a real-world problem to a computational problem and design an algorithm to solve the problem computationally and analyze its running time and storage space complexities.


Pedagogy

There will be balanced emphasis on both theory and practice. Theory requires rigorous thinking and practice requires intuition and experience. The level of difficulty is medium to high for a majority of students, and the course is designed mostly for upper class undergraduate students. The course will be structured as a sequence of lectures accompanied by weekly written assignments. Additionally, there will be programming assignments, which are meant to give hands-on coding experiences of algorithms studied in class.