Algorithms are pervasive in computer science. Finding the shortest path to route messages on the Internet, sequencing the genome, and scheduling courses, instructors and classrooms for a semester are some examples that demonstrate the diversity of applications that rely heavily on algorithmic solutions.
In this course, we will focus on developing an understanding of the algorithmic design process: how to identify the algorithmic needs of an application and apply algorithmic design techniques to solve those problems. We will also learn how to identify problems for which no exact, efficient algorithm is known.
Topics covered include graphs, greedy algorithms, divide and conquer, dynamic programming, network flow, NP-completeness and computational intractability.