The course-level learning goals are

- Recognize which algorithm design technique(s), such as divide and conquer, greedy algorithms, or dynamic programming was used in a given algorithm.
- Select and judge several promising paradigms and/or data structures (with some modifications) for a given problem by analyzing the problems properties.
- Implement a solution to a problem using a specified algorithm design paradigm.
- Prove the correctness of an algorithm using proof techniques such as direct proofs, proofs by contradiction and mathematical induction.
- Select, judge and apply suitable mathematical techniques (such as asymptotic notations and recurrence relations) to establish reasonably tight upper and lower bounds on the running time of algorithms.
- Recognize similarities between a new problem and some of the problems they have encountered, and judge whether or not these similarities can be leveraged towards designing an algorithm for the new problem.