L’algorithme de Fomin et al., bien que simple dans sa vision globale (voir
Alg. 3), se d´ecoupe en sous-probl`emes parfois coˆuteux (en terme polynomial)
avec dans l’ordre :
1. Recherche de composantes connexes dans un graphe
2. Recherche de noeuds domin´es
3. Pliage de noeuds (et d´epliage le cas ´ech´eant)
4. Recherche de noeuds mirroirs
2.3.1 Recherche de composantes connexes
Cette op´eration correspond `a un parcours en profondeur (DFS). Dans l’al-
gorithme, il suffit de renvoyer la premi`ere composante connexe trouv´ee. Je ne
d´etaille ici pas les op´erations d’un DFS (trivial). Il faut juste noter que le sommet
source est pris au hasard. La complexit´e d’un DFS est en O(n+m).
2.3.2 Recherche de noeuds domin´es
La recherche de noeuds domin´es est un peu plus coˆuteuse en temps que
l’op´eration pr´ec´edente. N´eanmoins, elle ne sera appel´ee qu’une seule fois par
appel r´ecursif et n’a besoin que de renvoyer un seul sommet domin´e (ou on peut
renvoyer l’ensemble des sommets domin´es pour nettoyer le graphe de tous ses
sommets domin´es `a un moment pr´ecis de l’algorithme, test effectu´e qui n’a pas
chang´e les temps d’ex´ecution). Afin de trouver des sommets vet wtels que
N[w]⊆N[v], on est oblig´e de visiter tous les voisinages du graphe dans le pire
des cas. Ensuite, le probl`eme de trouver un noeud domin´e revient `a chercher
un recouvrement total d’un ensemble (de sommets) par un autre. Une strat´egie
simple consiste `a trier par taille les ensembles de voisinages de G, de commencer
par le plus grand, v´erifier s’il ne recouvre pas un ensemble de voisinage (en
commen¸cant par le plus petit), et recommencer l’op´eration tant que ce n’est pas
le cas (Alg. 4). On consid`ere que la relation N[x]7→ xest repr´esent´ee par une
table de hachage et que d´eterminer `a quel sommet correspond un voisinage se
fait en temps constant. Si l’on consid`ere la complexit´e dans le pire des cas, la
m´ethode contient un QuickSort qui se fait en O(n2) (il est n´eanmoins connu
que le QuickSort se comporte plutˆot bien en moyenne (Θ(n·log(n))) ), et la
recherche de recouvrement qui se fait en O(n3). Cependant, mˆeme s’il faudrait
le d´emontrer, on est loin d’atteindre cette borne et on s’approche plutˆot d’un
O(n2/2) (constat´e en pratique).
2.3.3 Pliage de noeuds (folding)
Avant de plier un noeud, il faut tout d’abord en rechercher un de degr´e 2 (en
O(3n)'O(n)). Plier un noeud vde Gpour obtenir ˜
G(v) se fait en 4 ´etapes :
1. ajouter un sommet uij pour chaque anti-arˆete uiujde N(v)
2. ajouter une arˆete entre uij et chaque sommet de N(ui)∪N(uj)
3. ajouter une arˆete entre chaque paire de nouveaux sommets
5