# Approximation Algorithms

###
About *Approximation Algorithms:*

From the introduction:

This book deals with designing polynomial time approximation algorithms for NP-hard optimization problems. Typically, the decision versions of these problems are in NP, and are therefore NP-complete. From the viewpoint of exact solutions, all NP-complete problems are equally hard, since they are inter-reducible via polynomial time reductions. Typically, such a reduction maps optimal solutions of the given instance to optimal solutions of the transformed instance and preserves the number of solutions. Indeed, the counting versions of all known NP-complete problems are NP-complete, and typically the proof follows directly from the proof of NP-completeness.

The picture looks different when these problems are studied from the viewpoint of efficiently obtaining near-optimal solutions: polynomial time reductions do not preserve near-optimality of solutions, and NP-complete problems exhibit a rich set of possibilities, all the way from allowing approximability to any required degree, to essentially not allowing approximability at all.

A problem is polynomial time solvable only if it has the algorithmically relevant combinatorial structure that can be used as "footholds" to efficiently hone in on a solution. The process of designing a polynomial time algorithm is a two-pronged attack: unraveling this structure in the given problem, and finding algorithmic techniques that can exploit this structure.

Although NP-hard problems do not offer footholds to find optimal solutions efficiently, they may still offer footholds to find near-optimal solutions efficiently. So, at a high level, the process of designing approximation algorithms is not very different: it still involves unraveling relevant structure and finding algorithmic techniques to exploit it. Typically, the structure turns out to be more elaborate, and often, the algorithmic techniques result from generalizing and extending sonic of the powerful algorithmic tools developed in the study of exact algorithms. On the other hand, looking at this process a little more closely, one can see that it has its own general principles.

This book deals with designing polynomial time approximation algorithms for NP-hard optimization problems. Typically, the decision versions of these problems are in NP, and are therefore NP-complete. From the viewpoint of exact solutions, all NP-complete problems are equally hard, since they are inter-reducible via polynomial time reductions. Typically, such a reduction maps optimal solutions of the given instance to optimal solutions of the transformed instance and preserves the number of solutions. Indeed, the counting versions of all known NP-complete problems are NP-complete, and typically the proof follows directly from the proof of NP-completeness.

The picture looks different when these problems are studied from the viewpoint of efficiently obtaining near-optimal solutions: polynomial time reductions do not preserve near-optimality of solutions, and NP-complete problems exhibit a rich set of possibilities, all the way from allowing approximability to any required degree, to essentially not allowing approximability at all.

A problem is polynomial time solvable only if it has the algorithmically relevant combinatorial structure that can be used as "footholds" to efficiently hone in on a solution. The process of designing a polynomial time algorithm is a two-pronged attack: unraveling this structure in the given problem, and finding algorithmic techniques that can exploit this structure.

Although NP-hard problems do not offer footholds to find optimal solutions efficiently, they may still offer footholds to find near-optimal solutions efficiently. So, at a high level, the process of designing approximation algorithms is not very different: it still involves unraveling relevant structure and finding algorithmic techniques to exploit it. Typically, the structure turns out to be more elaborate, and often, the algorithmic techniques result from generalizing and extending sonic of the powerful algorithmic tools developed in the study of exact algorithms. On the other hand, looking at this process a little more closely, one can see that it has its own general principles.