ND-partizione (A) n A somma 0 M 1/2 ( a i ) for i 1 to n do S[i] choice ({true, false}) if S[i] then somma somma + a i if somma > M then failure if somma = M then success failure Esercizio 1 1. Scrivere un programma non deterministico di complessità polinomiale per il problema “Partizione” Partizione: Dato un insieme di interi positivi A = {a 1, a 2,…, a n }, esiste un sottoinsieme S degli indici {1, 2,…, n} tale che i S a i = i S a i ?
En-partizione (A) n A somma 0 M 1/2 ( a i ) if EN_Part (1, somma) then write “esiste il sottoinsieme cercato” else write “il sottinsieme cercato non esiste” 1. Scrivere l’equivalente programma deterministico per enumerazione
EN_Part (i, somma) if i n then S[i] false if EN_Part (i+1, somma) then return true S[i] true if somma + a i = M then return true if somma + a i < M then return EN_Part (i +1, somma + a i ) else return false
1. Dimostrare che CRICCA ott P CRICCA dec P. Sia ALG ott un algoritmo deterministico di complessità polinomiale che, dato un grafo G, trova la dimensione massima di una cricca in G. Si può allora scrivere il seguente algoritmo, deterministico e con la stessa complessità di ALG ott, per risolvere il problema di decisione: Esercizio 2 ALG dec (G, k) h ALG (G) if h k then return true else return false
2. Dimostrare che CRICCA dec P CRICCA ott P. Sia ALG dec un algoritmo deterministico di complessità polinomiale che risolve il problema CRICCA dec. Si può allora scrivere il seguente algoritmo deterministico per trovare la dimensione massima di una cricca in un grafo. ALG ott (G) n |V[G]| k n while k > 1 do if ALG dec (G, k) then return (k) k k-1 return (k) Complessità: O((n-1). p), se O(p) è la complessità di ALG dec
Esercizio 3 Sia un algoritmo che verifica la soddisfacibilita` delle formule booleane e siano {x 1,…,x n } le variabili che occorrono nella formula fornita in input. Possiamo allora costruire il seguente algoritmo: Dimostrare che, se esistesse un algoritmo deterministico di complessita` polinomiale che verifica la soddisfacibilita` di formule booleane, esisterebbe anche un algoritmo deterministico cdi complessita` polinomiale che, data una formula, trova, se esiste, un assegnamento che la soddisfa.
( ) n |Var ( )| if ( ) then for i 1 to n do x i true [x i / true] if ( ) then else x i false [x i / false] else write “la formula non è soddisfacibile” L’algoritmo effettua n-1 chiamate ad , se n e` il numero di variabili in , quindi se fosse di complessita`polinomiale, anche lo sarebbe.