(See the course syllabus for more detail.)
The purpose of this course is to introduce students to various techniques in Algorithms Design. The content includes divide-and-conquer, graph algorithms, greedy algorithms, dynamic programming, NP-completeness, linear program, approximation algorithms, randomized algorithms, and foundations of big data analysis. Students are expected to apply these principles to problems arising the real-world settings. Unlike the introductory programming courses, we will emphasize on the principles, rather than the implementation. This means that mathematical rigor will be crucial in this course, in addition to the ability to design algorithms. Students are expected to not only be able to come up with the algorithms, but also to be able to argue rigorously that their algorithms work correctly and efficiently.
(Remark: a recommended course in case you are interested in hands-on work)