I. COURSE OVERVIEW: Introduction to fundamental techniques for designing and analyzing algorithms, including asymptotic analysis; divide-and-conquer algorithms and disjoint set operations; graph algorithms; backtracking algorithms; greedy algorithms; dynamic programming; and branch and bound algorithms; NP-Hard and NP-Complete problems;

II. PREREQUISITE(S):
1. Problem Solving Skills
2. Basic Programming
3. Data Structures
4. Formal Languages and Automata Theory
COURSE OBJECTIVES:

To analyze performance of algorithms.
To choose the appropriate data structure and algorithm design method for a specified application.
To understand how the choice of data structures and algorithm design methods impacts the performance of programs.
To solve problems using algorithm design methods such as the greedy method, divide and conquer, dynamic programming, backtracking and branch and bound.
To understand the differences between tractable and intractable problems.
To introduce P and NP classes.
LEARNING OUTCOMES:

Ability to analyze the performance of algorithms.
Ability to choose appropriate algorithm design techniques for solving problems
Ability to understand how the choice of data structures and the algorithm design methods impact the performance of programs.
Evaluation scheme: Internal1- 25%

Internal2-25 %

Midterm-20%

Endterm-30%