**Understand** algorithm design techniques, and **understand** how and when to use appropriate technique to a given computational problem.

**Differentiate** effieicent vs non-efficient algorthmic solutions.

**Understand** and **apply** various known algorithms in the literature to a given computational problem.

**Understand** the behaviour of a given algorithm, and **predicting** the quality of the algorithm in terms of its efficiency.

**Check** the correctness of a given algorithm in terms of solving the computational problem.

**Remember** and **use** a large number of well-known algorithms in the literature.

**Critique** different algorithms for the same problem.

**Interpret** a computational problem specification and **implement** a solution in a programming language to solve that problem.

**Construct** new algorithms for new problems.

**Modify** an existing algorithm to a new problem to accommodate for extension and/or change of problem specifications.

**Design** a modular solution to a problem by **decomposing **it into smaller sub-problems.