Description: Algorithms are the recipes that underlie all computations executed by a computer. Designing new algorithms, proving their correctness, and analyzing their computational requirements are three foundational tasks in all areas of computer science. This course covers all these three aspects of algorithms. Topics covered include growth of functions, asymptotic notation and analysis, graphs and their properties, graph exploration, graph algorithms, greedy algorithms, divide-and-conquer algorithms, dynamic programming, NP-Completeness, and heuristic search algorithms. In order to enroll in an online section of this course, you are expected to have a working camera and microphone. During class sessions, you must be able to participate using your microphone and you are expected to have your camera on for the duration of the class so that you are visible to the instructor and other students in the class, just as you would be in an in-person class.