For the test, you should:

1) understand the concept of big-oh, theta, and omega notation. I will not ask you to find the constants c and N to prove a function satisfies one of the definitions, but you should have a good feel for the usage and meaning of these notations. (e.g., If you buy a computer that is 1000 times faster, how big a problem can you solve in one minute....)

2) understand the general concept of the divide-and-conquer and dynamic programming problem-solving techniques.

3) understand the divide-and-conquer and dynamic programming algorithms for problems discussed in class (see table below). You should be able to trace the algorithms on specified data, and be able to describe the major concepts of the algorithm.

4) be able to apply divide-and-conquer and dynamic programming techniques to "new" (i.e., not in the text) problems.

5) be able to write recurrence relations for divide-and-conquer algorithms.

6) be able to solve recurrence relations using the techniques of Appendix B (especially the technique of substitution and using the characteristic equation).

7) be able to analyze an algorithm containing nested loops to determine its theta notation, i.e., be able to trace the loops, formulate a summation, write a closed-form expression (no "+ ... +") for the summation, and finally determine its theta notation.

**Algorithms Discussed in Class**

Technique |
Problems |

Divide-and-Conquer | Coin-change problem Fibonacci Binary search Merge sort Traveling-Salesperson 0-1 Knapsack Problem |

Dynamic Programming | Coin-change problem Fibonacci Binomial Coefficient Floyd's Shortest Paths Algorithm Optimal Binary Search Tree Traveling-Salesperson 0-1 Knapsack Problem |