# Exam 2 Review ## Reductions We say that a problem $A$ reduces to a problem $B$ if there is a **polynomial time** reduction function $f$ such that for all $x$, $x \in A \iff f(x) \in B$. To prove a reduction, we need to show that the reduction function $f$: 1. runs in polynomial time 2. $x \in A \iff f(x) \in B$. ### Useful results from reductions 1. $B$ is at least as hard as $A$ if $A \leq B$. 2. If we can solve $B$ in polynomial time, then we can solve $A$ in polynomial time. 3. If we want to solve problem $A$, and we already know an efficient algorithm for $B$, then we can use the reduction $A \leq B$ to solve $A$ efficiently. 4. If we want to show that $B$ is NP-hard, we can do this by showing that $A \leq B$ for some known NP-hard problem $A$. $P$ is the class of problems that can be solved in polynomial time. $NP$ is the class of problems that can be verified in polynomial time. We know that $P \subseteq NP$. ### NP-complete problems A problem is NP-complete if it is in $NP$ and it is also NP-hard. #### NP A problem is in $NP$ if 1. there is a polynomial size certificate for the problem, and 2. there is a polynomial time verifier for the problem that takes the certificate and checks whether it is a valid solution. #### NP-hard A problem is NP-hard if every instance of $NP$ hard problem can be reduced to it in polynomial time. List of known NP-hard problems: 1. 3-SAT (or SAT) 2. Independent Set 3. Vertex Cover 4. 3-coloring 5. Hamiltonian Cycle 6. Hamiltonian Path ## Approximation Algorithms ## Randomized Algorithms ## Online Algorithms