Si cerca di catalogare dal punto di vista computazionale i problemi intrattabili, ovvero problemi risolvibili ma non in modo efficiente (ovvero in tempo polinomiale). In alcuni casi si pensa che non esista una soluzione ma non si hanno dimostrazioni in merito, mentre in altri casi è addirittura dimostrato. Abbiamo quindi delle categorie informali per i problemi:
Facili (o trattabil): so risolverli in modo efficiente.
Difficili, o più formalmente, intrattabili: so risolverli ma non in modo efficiente e non ho una dimostrazione che mi assicuri che non siano risolvibili in modo efficiente.
Esistono anche problemi forse intrattabili.
Dimostrabilmente difficili: risolvibili con algoritmo non efficiente e posso dimostrare che non esiste un algoritmo efficiente. Sono poco interessanti.
impossibili (o indecidibili): posso dimostrare che non esiste un algoritmo che li risolve (indipendentemente dalle risorse computazionali)
Andiamo a definire alcuni concetti che utilizzeremo:
Definizione: Problema Computazionale: è composto da un input, da un output, e dalla relazione che c’è tra di essi.
Definizione: Algoritmo: Una procedura composta da un numero finito di operazioni concrete e generali tale che se applicata a un’istanza, calcola un output corretto del problema in un tempo finito (per tutte le possibili istanze).
Definiamo un algoritmo come una sequenza di istruzioni elementari (supportate dal calcolatore) che, eseguite in sequenza, mi portano alla soluzione di un problema. Si ha quindi che un algoritmo $A$ risolve un problema $\Pi$ se per ogni possibile istanza di $\Pi$ l’algoritmo $A$ mi da la risposta corretta.
Distinguiamo però: