This is a graduate-level course in the design and analysis of algorithms. We study techniques for the design of algorithms (such as dynamic programming) and algorithms for fundamental problems (such as fast Fourier transform or FFT).
In addition, we study computational intractability, specifically, the theory of NP-completeness. The main topics covered in the course include: dynamic programming; divide and conquer, including FFT; randomized algorithms, including RSA cryptosystem and hashing using Bloom filters; graph algorithms; max-flow algorithms; linear programming; and NP-completeness.
Why Take This Course?
The design and analysis of algorithms form an essential basis for computer science. This course is useful for those who want to pursue advanced studies in computer science, as well as those who want to work as a software engineer.
Fibonacci Numbers, Longest Increasing Subsequence (LIS), Longest Common Subsequence (LCS)
Knapsack, Chain Matrix Multiplication
Shortest Path Algorithms
Modular Arithmetic: Fast Modular Exponentiation, Multiplicative Inverses
RSA Cryptosystem: Fermat's Little Theorem, RSA Protocol, Primality Testing