Design and analysis of algorithms using six algorithmic design techniques: divide-and-conquer, greedy method, dynamic programming, tree and graph traversals, backtracking, and branch-and-bound. Lower bound theory. NP-complete theory.

Prerequisites: CS 1311, CS 1112.

Text: Introduction to Algorithms, Cormen, Leiserson Rivest, and Stein, third Edition, 2009

Announcement:

- Introduction
- Data Structures
- Divide and Conquer
- The Greedy Method
- Dynamic Programming
- Graph Traversal Techniques
- Backtracking
- Branch and Bound
- NP-Complete Theory

- Basic Principles of Algorithm Design and Analysis
- Data Structures: Stacks, queues, linked lists, trees, binary search trees, heaps, graphs, sets, union-find
- The Divide and Conquer Method: Overall technique, mergesort, quicksort, quickselect, FFT, etc.
- The Greedy Method: Overall technique, the knapsack problem, optimal merge pattern, Huffman coding, minimum spanning tree, single-sourse shortest paths problem, etc.
- Dynamic Programming: Overall technique, matrix chain problem, all-pairs shortest path problem, optimal binary search trees, etc.
- Graph Traversal Techniques: Tree traversal and applications, depth-dirst search, bread-first search, connectivity algorithms, biconnectivity algorithms, etc.
- Backtracking: Overall technique, generation of combinatorial objects such as graphs, sets, permutations, graph colorings, cliques, Hamiltonian cycles, etc.
- Branch and Bound method: Overall method, the 0/1 knapsack problem, the job assignment problem, the traveling salesman problem, etc.
- Lower bound theory: Techniques for determining complexity lower bounds of problems, algorithm modeling, application to lower bound on sorting, searching, and merging.
- Introduction to the Theory of NP-completeness: Nondeterministic algorithms, complexity classes, NP-completeness, problem reduction, Specific NP-complete problems.