• Aucun résultat trouvé

Soient n éléments : x1, x2, ..., xn; répartis en n classes d’équivalence : c1, c2, ..., cn. On

cherche à effectuer des fusions successives. Il s’agit en fait d’un problème de graphe où l’on rajoute des arêtes.

8.4.1 Représentation en listes chaînées

Chaque classe d’équivalence est représentée par une liste chaînée où chaque élément pointe sur le représentant de la classe.

Pour réaliser l’union de deux classes dont on a les éléments x et y, on cherche tout d’abord leur père (le représentant de la classe d’équivalence à laquelle ils appartiennent), s’il diffère alors on concatène la plus petite liste à la plus grande et on fait pointer tous les éléments de la petite vers le représentant de la plus grande.

Le coût de n unions successives est majoré par nlog(n), et non pas O(n2) comme on pourrait

penser en comptant n opérations de coût O(n) chacune. En effet, le pointeur de chaque élément change log2(n) fois au maximum. Au début : un élément appartient à une classe d’équivalence

de taille 1. Si son pointeur change, c’est que cet élément a été uni à une classe d’équivalence de taille au moins égale à la sienne, et donc qu’il se retrouve dans une classe d’équivalence de taille au moins 2. Si son pointeur change c’est qu’il a été uni à une classe au moins double que précédemment. On trouve donc un coût amorti en nlog2(n).

8.4.2 Représentation en arbres

On peut améliorer le résultat précédent en représentant les classes d’équivalence à l’aide de forêts. Trouver un élément a un coût d’au moins la hauteur de l’arbre, tandis qu’unir a un coût en temps constant. Ainsi trouver le père est plus cher mais le gain sur l’opération d’union est beaucoup plus important, en outre lorsque l’on recherche le père on compresse la forêt (tout

élément parcouru et mis en feuille de la racine) ce qui permet des recherches ultérieures plus rapides.

Cet algorithme très célébre de gestion des partitions est dû à Tarjan ? Le calcul du coût amorti est difficile. Retenons qu’il est en O(nα(n)), où α(n) est l’inverse de la fonction d’Ackermann, et croît lentement mais inexorablement vers +∞.

8.5 Références bibliographiques

Chapitre 9

N P-Complétude

9.1 P versus NP

On distingue deux types de problèmes de décision :

- ceux qui peuvent être résolus en temps polynomial en la taille des données (classe P)

- ceux pour lesquels on peut vérifier un certificat donnant la solution, en temps polynomial en la taille des données (classe N P)

Bien sûr P ⊂ N P. A défaut de savoir si cette inclusion est stricte ou non, on considère la classe des problèmes NP-complets, qui sont les problèmes les plus difficiles de la classe N P : si on connaissait une solution polynomiale pour l’un d’entre eux, on en connaîtrait une pour tout problème de la classe, et on aurait l’égalité P = N P. Le plus difficile est de trouver le premier problème NP-complet, et cela a été le travail de Cook qui a montré que SAT était complet (voir par exemple le livre de Wilf, disponible gratuitement sur le Web, cf. les références). Ici, on va procéder par réduction, pour augmenter la liste des problèmes NP-complets. On verra ci-après 3-SAT, CLIQUE, VERTEX-COVER. On mentionne aussi CH, le problème du circuit hamiltonien (voir feuilles de cours). Enfin, on démontre la NP-complétude de trois problèmes de coloration de graphes : COLOR, 3-COLOR, et 3-COLOR-PLAN.

9.2 3-SAT

Définition 9 (SAT). Soit F une formule booléenne à n variables x1, x2, ..., xn et p clauses Ci :

F = C1∧ C2∧ ... ∧ Cp où Ci= x∗i1 ∨ x ∗ i2 ∨ ... ∨ x ∗ if(i) et x ∗= x ou x

Existe-t-il une instanciation des variables telle que F soit vraie ? (⇔ Ci vraie pour tout i)

Avec plusieurs variantes N P-complètes :

– SAT-k : SAT avec au plus k occurrences de chaque xi

– 3-SAT : SAT où chaque clause a 3 littéraux Ci = x∗i1∨ x

∗ i4∨ x

∗ i3

– 3-SAT NAE : "not all equal", les trois variables de chaque clause ne sont pas toutes à la même valeur

– 3-SAT OIT : "one in three", exactement une variable est VRAI dans chaque clause Remarque : 2-SAT peut être résolu en temps polynomial

Méthode de réduction d’un problème P à partir d’un problème P& N P-complet :

2. P est complet : on réduit à partir de P&. On transforme une instance I

1 de P& en une

instance I2 de P

(a) taille(I2) = P(taille(I1))

(b) I1 a une solution ⇔ I2 a une solution

Théorème 12. 3-SAT est N P-complet

Preuve. 1. 3-SAT ∈ N P Soit I une instance de 3-SAT taille(I) = O(n + p)

Certificat : valeur de chaque xi

Vérification en O(p) 2. 3-SAT est complet

Réduction à partir de SAT, premier problème montré NP-complet par Cook. Soit I1 une instance de SAT

nvariables x1, ..., xn

p clauses C1, ..., Cp de longueurs f(1), ..., f(p)

taille(I1) = O(n +$pi=1f (i))

Ci : clause de P dans I1

– 1 variable x : soit ai et bi deux nouvelles variables

x∨ ai∨ bi

x∨ ai∨ bi

x∨ ai∨ bi

x∨ ai∨ bi

– 2 variables x1∨ x2 : soit ci une nouvelle variable

x1∨ x2∨ ci

x1∨ x2∨ ci

– 3 variables : aucun changement

– k variables, k > 3, Ci = x1∨ x2∨ ... ∨ xk soit z(i)1 , z (i) 2 , ..., z (i) k−3 (k − 3) nouvelles variables x1∨ x2∨ z1(i) x3∨ z1(i)∨ z (i) 2 ... xk−2∨ zk−4(i) ∨ z (i) k−3 xk−1∨ zk−3(i) ∨ xk

(a) taille(I2) linéaire en taille(I1)

(b) (⇒) : si I1 a une solution c’est à dire une instanciation des xi telle que ∀j Cj soit

vraie.

Une solution pour I2 est :

xi " inchangé

ai" VRAI

bi" FAUX

ci " VRAI

y1∨ ... ∨ yk

z1, ..., zi−2" VRAI

zi−1, ..., zk−3" FAUX

(c) (⇐) si I2 a une solution :

Instanciation des xi, ai, bi, ci, zji " VRAI/FAUX

Les x1, ..., xn marchent pour la formule de départ.

9.3 Clique

Définition 10 (CLIQUE). Soit un graphe G = (V, E), et un entier k : 1 ≤ k ≤ |V | Existe-t-il une clique de taille k (un sous graphe complet de k sommets) ?

Taille d’une instance : |V | + |E| ou |V | (car |E| ≤ |V |2)

Théorème 13. CLIQUE est N P-complet Preuve. 1. CLIQUE ∈ N P

Certificat : liste des sommets de la clique.

Vérification en temps quadratique (pour chaque paire, l’arête doit appartenir à E). 2. CLIQUE est complet

Réduction à partir de 3-SAT

Soit I1 une instance de 3-SAT avec n variables boolénnes et p clauses de taille 3

Exemple du Cormen : C1∧ C2∧ C3

C1= x1∨ x2∨ x3

C2= x1∨ x2∨ x3

C3= x1∨ x2∨ x3

3 sommets pour chaque clause, et une arête entre deux sommets si et seulement si : (i) ils ne font pas partie de la même clause

(ii) ils ne sont pas antagonistes (ne représentent pas une variable et sa négation)

I1 IL INW I1 IL IN IL IN I1 W W I2 graphe à 3p sommets.

taille(I2) polynomiale en taille(I1).

3-SAT⇒ k-Clique : on sélectionne un sommet correspondant à une variable vraie dans chaque clause, et on a bien une clique, car deux de ces sommets ne sont pas contradictoires. k-Clique⇒ 3-SAT : si on a une clique de taille k, alors il y a un sommet par clause. On le

sélectionne pour instancier les variables, et c’est cohérent car on ne fait pas ainsi de choix contradictoire.