Reduceri polinomiale

Reducerile polinomiale ne oferă posibilitatea de a utiliza un algoritm ce rezolvă o problemă pentru o altă problemă fără a-i crește complexitatea (adăugând overhead cel mult polinomial).

Reducerea polinomială reprezină o relație între două probleme $ f$ și $ g$, notată $ f \leq_p g$ (citim “f se reduce (în timp) polinomial la g”) și înseamnă că putem găsi o transformare computabilă în timp polinomial care transformă input-urile problemei $ f$ în input-uri ale problemei $ g$ în așa fel încât output-urile să fie egale. Adică $$ f \leq_p g \iff \exists t \text{ computabilă în timp polinomial}: \forall i, f(i) = g(t(i))$$

Exerciții

Realizați următoarele reduceri polinomiale:

  • $ {\rm Partioning} \le_p {\rm SubsetSum}$
  • $ {\rm SubsetSum} \le_p {\rm Partioning}$
  • $ {\rm HamiltonianCycle} \le_p {\rm HamiltonianPath}$
  • $ {\rm GraphUnreachability} \le_p {\rm 2SAT}$ unde $ {\rm GraphUnreachability}$ intreaba daca NU exista nici un drum intre doua noduri $ s$ si $ t$ intr-un graf $ G$
  • $ {\rm 3SAT} \le_p {\rm kVertexCover}$
Soluțiile acestui laborator se găsesc aici