Sunteți pe pagina 1din 14

Rsum du chapitre 4 : Lapproche vorace e e

721 oct. 2002

Lapproche vorace

Note : On utilise aussi le terme glouton plutt que vorace. o Intuition : dans lapproche vorace, une solution est obtenue en eectuant une squence e de choix, chaque choix se faisant sur la base dinformation locale, en choisissant ce qui semble le mieux au moment o` le choix seectue (et en esprant que cela m`ne ` la u e e a solution optimale globale). Les algorithmes voraces sont souvent utiliss, comme les algorithmes de programmation e dynamique, pour rsoudre des probl`mes doptimisation. Ils produisent un rsultat e e e optimal si le probl`me satisfait la proprit de choix vorace (greedy choice) = la solution e ee globale peut tre obtenue par une srie de choix optimums locaux. e e Mais, . . . , ce ne sont pas tous les probl`mes qui satisfont cette proprit. e ee Exemple : rendre la monnaie
DEBUT // Notons montantRestant le montant quil reste a rendre ` TANTQUE il reste des pi`ces disponibles et montantRestant >= 0 FAIRE e p <- pi`ce la plus grande parmi les pi`ces restantes e e SI p > montantRestant ALORS Rejeter la pi`ce p e SINON ajouter p aux pi`ces ` rendre e a montantRestant <- montantRestant - p FIN FIN SI montantRestant == 0 ALORS Le probl`me est rsolu! e e FIN FIN

Exemples : Figure 4.1 (p. 136) : un exemple o` lalgorithme vorace donne une solution optiu male. Figure 4.2 (p. 138) : un exemple o` lalgorithme vorace ne donne pas une solution u optimale. 1

Principales composantes dune approche vorace : Lalgorithme dbute avec un ene semble vide ditems et ajoute, de faon rptitive, des items dans lensemble jusqu` ce c e e a quune solution optimale soit obtenue. Chaque itration consiste dans les composantes e suivantes : Une procdure de slection, qui choisit le prochain item a inclure dans lensemble. e e ` Un test de faisabilit, qui dtermine si le nouvel ensemble conduit a une solution e e ` faisable, cest-`-dire, pouvant tre tendu en compltant cet ensemble par dautres a e e e lments. ee Une vrication de la solution, qui dtermine si le nouvel ensemble constitue une e e solution a linstance du probl`me. ` e

4.1

Arbres minimum de recouvrement

Etant donn un graphe non orient valu G = (V , E ) (voir Figure 4.3 du manuel, e e e p. 139), un arbre minimum de recouvrement (minimum spanning tree) est un sousgraphe connexe de G qui contient tous les sommets de G, sous-graphe qui est aussi un arbre (graphe connexe sans cycle) et dont la somme des pondrations des artes est e e minimale.

PROCEDURE arbreRecouvrement( G: Graphe ): Graphe PRECONDITION G = (V, E) G est un graphe connexe DEBUT F <- {} solutionTrouvee <- FAUX TANTQUE NON solutionTrouvee FAIRE e <- slectionner une arte e qui semble intressante e e e SI lajout de e ` F ne cre pas de cycle ALORS a e F <- F U {e} SI (V, F) est un arbre de recouvrement pour G ALORS solutionTrouvee <- VRAI FIN FIN FIN RETOURNER (V, F) FIN

Figure 1: Forme gnrale dune solution vorace au probl`me de larbre de recouvrement e e e minimum Une solution vorace pour ce probl`me aurait lallure du pseudo-code prsent ` la Fige e ea ure 1, o` lon cherche F tel que T = (V , F ) soit un arbre de recouvrement minimal u pour G (donc F E ). 2

Proprit cruciale dun arbre de recouvrement minimal e e

e V1
Arete de poids minimum

V2

Figure 2: Une illustration de la proprit cruciale dun arbre de recouvrement ee Avant dexaminer plus en dtails deux algorithmes dirents pour le calcul dun arbre e e de recouvrement minimal, il est intressant de prsenter une proprit des arbres de e e ee recouvrement qui permet de mieux comprendre et justier pourquoi ces algorithmes e fonctionnent correctement (adapt de M.T. Goodrich et R. Tamassia, Data Structures and ee e a Algorithms in Java, John Wiley & Sons, 1998). Cette proprit est illustre ` la Figure 2. Proposition : Soit G = (V , E ) un graphe non orient, pondr et connexe. Soit V1 et e ee V2 deux ensembles disjoints non vides tels que V = V1 V2 . Soit e une arte dans G e de poids minimum parmi toutes celles qui relient un sommet dans V1 ` un sommet dans a e V2 . Alors, il existe un arbre de recouvrement minimum T dont lune des artes est e. Justication : (Preuve par contradiction) Supposons que la proposition soit fausse, donc quil nexiste aucun arbre de recouvrement minimum qui contient larte e (larte non e e pointille reliant V1 et V2 dans la Figure 2). Soit alors T un arbre de recouvrement e minimum. Si on ajoute larte e aux artes de T , un cycle sera ncessairement cr. e e e ee Puisque lajout de e crerait un cycle, il existe donc une arte f de larbre T qui relie e e un sommet de V1 ` un sommet de V2 (lune des artes pointilles dans la Figure 2). De a e e plus, on a que le poids de e est larte de poids minimum parmi toutes celles reliant V1 e et V2 , cest-`-dire, poids(e) poids(f ). Si on supprime f de T en ajoutant e, alors on a aura quand mme un arbre de recouvrement, et son poids ne sera pas suprieur ` celui e e a de T . Puisque T tait un arbre de recouvrement minimum, ce nouvel arbre obtenu par e le remplacement de f par e sera lui aussi un arbre de recouvrement minimum. Or, nous avons suppos quil nexistait pas de tel arbre contenant e. Notre hypoth`se de dpart e e e tait donc fausse. On peut donc conclure quil existe bien un arbre de recouvrement e minimum qui contient e.

4.1.1

Algorithme de Prim

Soit Y un ensemble de sommets provenant de G = (V , E ), G tant un graphe connexe. e Le sommet le plus pr`s de Y est un sommet v V -Y qui est reli ` un sommet de Y e ea par une arte de poids minimum. e e Note : Sil nexiste aucune arte entre s et s , on note alors le poids comme tant +. e

PROCEDURE arbreRecouvrement( G: Graphe ): Graphe PRECONDITION G = (V, E) G est un graphe connexe DEBUT F <- {} Y <- {v1} // Le choix du sommet de dpart est arbitraire e TANTQUE Y = V FAIRE v <- slectionner un sommet dans V-Y qui est le plus pr`s de Y e e Y <- Y U {v} F <- F U {arte (de poids minimum) qui relie v ` Y} e a FIN RETOURNER (Y, F) FIN

Figure 3: Description de haut niveau de lalgorithme de Prim Description de haut niveau de lalgorithme de Prim : Figure 3. Supposons que les poids des artes de G sont donns par la matrice suivante : e e
poids({vi , vj })

W [i ][j ] =

+ 0

sil existe une arte entre vi et vj e sil nexiste aucune arte entre vi et vj e si i = j

Lalgorithme 4.1 du manuel (prsent aux pages 144145) permet alors de dterminer e e e un arbre de recouvrement minimum (le choix du sommet de dpart v1 est arbitraire). e Les structures de donnes utilises par lalgorithme jouent les rles suivants : e e o nearest[i] = indice du sommet dans Y le plus pr`s de vi . e Puisque Y varie en cours dexcution, au fur et a mesure o` on y ajoute des some ` u mets, ce tableau sera donc lui aussi mis ` jour, a chaque fois en fonction du nouvel a ` lment ajout ` Y. ee ea Notons aussi que, initialement, nearest[i] = 1 pour tous les i 2, puisque Y ne contient initialement que le sommet v1 . Soulignons que le choix du sommet initial na pas dimportance : ultimement, pour que lon ait un arbre de recouvrement, tous les sommets devront ncessairement tre inclus. e e 4

distance[i] = poids sur larte qui relie vi ` larte indexe par nearest[i] (le e a e e sommet de Y le plus pr`s du sommet vi ). e Cette distance va videmment tre mise ` jour en fonction de nearest[i], ceste e a a `-dire, en fonction de lajout dun nouvel lment dans Y. ee Donc, au fur et a mesure que de nouvelles artes sont ajoutes ` Y, les tableaux nearest ` e e a ` et distance sont mis ` jour en fonction du nouveau sommet ajout dans Y. A chaque a e itration de lalgorithme, il faudra donc dterminer lindex pour lequel distance[i] est e e minimum, ce qui nous permettra de dterminer le sommet le plus pr`s de Y. Cest lindex e e de ce sommet qui est conserv dans la variable vnear. e e e Initialement, Y = {v1 }, donc ces structures de donnes sont initialises comme suit : nearest[i] = 1. distance[i] = poids de larte qui relie v1 ` vi (peut tre + sil ny a pas une e a e telle arte). e Explications plus dtailles de lalgorithme de Prim (pp. 144145 du manuel) : e e La boucle for au dbut de lalgorithme (p. 144) initialise nearest et distance e pour Y ne contenant que v1 . La premi`re boucle for ` lintrieur de la boucle repeat (p. 145) dtermine larte e a e e e qui est la plus pr`s de Y. La condition 0 distance[i] est utilise pour ne pas e e examiner les sommets qui sont dj` prsents dans Y (la distance dun tel sommet ea e par rapport a Y est dnie, juste apr`s lajout de larte e ` F, comme tant -1). ` e e e a e La deuxi`me boucle for met ` jour les tableaux nearest et distance. On exae a mine chacun des sommets qui nest pas dj` dans Y (si le sommet est dans Y, alors ea distance[i] = -1, donc linstruction if nest pas excute) : si la distance de ce e e sommet ` Y est infrieure ` ce quelle tait avant lajout du sommet slectionn a e a e e e (vnear), alors on modie distance, en indiquant que le sommet de Y qui est maintenant le plus pr`s est bien le nouveau sommet (nearest[i] = vnear;). e Complexit de lalgorithme pour G = (V , E ) : (n 2 ), o` n = |V | (nombre de e u sommets). Preuve que lalgorithme de Prim produit un arbre optimal : Voir Lemme 4.1, Figure 4.6 (p. 146) et Thor`me 4.1 (p. 147). e e La preuve repose sur la notion de sous-ensemble prometteur (promising) : un sousensemble dartes est prometteur si on peut lui ajouter des artes de faon ` obtenir e e c a un arbre minimum de recouvrement. Tout dabord, le lemme nous dit quun ensemble prometteur dartes peut tre tendu avec une autre arte de faon ` obtenir un nouvel e e e e c a ensemble prometteur si on choisit une arte de poids minimum qui relie un sommet de e Y ` un sommet de V -Y , Y tant dni comme lensemble des sommets rfrs dans a e e eee 5

lensemble prometteur. Ensuite, il sut de montrer par induction (Thor`me 4.1) que e e lensemble F de lalgorithme est toujours prometteur. Toutefois, sans entrer dans les dtails formels de la preuve, la proprit prsente ` la e ee e e a page 3 nous donne une bonne intuition sur pourquoi lalgorithme produit bien un arbre de recouvrement minimum. 4.1.2 Algorithme de Kruskal

Lapproche utilise par lalgorithme de Kruskal est dirente de celle utilise par lalgoe e e rithme de Prim. Dans lalgorithme de Prim, on tend petit a petit larbre a partir dun e ` ` ` sommet arbitraire. A une tape donne de lalgorithme, on a donc un ensemble de some e mets relis entre eux qui font partie de larbre nal, et un ensemble de sommets encore e isols. Par contre, au cours de lexcution de lalgorithme de Kruskal, on aura plutt e e o une fort (une collection darbres) et, a chaque tape de lexcution de lalgorithme, on e ` e e rduira la taille de cette fort en reliant ensemble deux des sous-arbres dj` identis. e e ea e Plus prcisment, dans lalgorithme de Kruskal, on commence par dnir une collection e e e de sous-ensembles disjoints de sommets (dlments de V ). On inspecte ensuite chacune ee des artes, en ordre non dcroissant de poids. Si larte slectionne relie deux sommets e e e e e dans des sous-ensembles encore disjoints, alors on lajoute aux artes de larbre de recoue vrement et on fusionne les deux sous-ensembles, puisque tous les sommets de ces deux sous-ensembles sont maintenant relis entre eux. En dautres mots, un sous-ensemble e de sommets dnote donc un groupe de sommets qui sont actuellement relis entre eux e e dans la fort qui formera larbre nal (une classe dquivalence, donc). Cest pour cela e e que si larte de poids minimum relie deux sommets qui font dj` partie du mme souse ea e ensemble, alors cette arte doit tre rejete (ne fera pas partie de larbre nal) car son e e e ajout crerait un cycle et on nobtiendrait pas un arbre. e Description de haut niveau de lalgorithme de Kruskal : Figure 4. Une partie cl de cet algorithme est la suivante : e SI larte e relie deux sommets entre Si et Sj avec i = j ALORS e // On fusionne les sous-ensembles S <- S - {Si , Sj } U {Si U Sj } F <- F U {e} FIN La tche eectue par cette partie de lalgorithme consiste a identier les sous-ensembles a e ` Si et Sj qui contiennent, respectivement, les sommets vi et vj associs ` larte e de poids e a e minimum slectionne ` ltape qui prc`de de lalgorithme. Cette partie de lalgorithme e e a e e e pourrait donc sexprimer de la faon suivante, en sachant que e relie les sommets dindex c i et j : Trouver lensemble Si qui contient le sommet i Trouver lensemble Sj qui contient le sommet j SI Si = Sj ALORS Fusionner Si et Sj en un seul ensemble 6

PROCEDURE arbreRecouvrement( G: Graphe ): Graphe PRECONDITION G = (V, E) G est un graphe connexe DEBUT F <- {} // On notera S = {S1 , ..., Sk } e S <- { {vi } | 1 i |V| } // On cre un sous-ensemble distinct pour chaque sommet E <- squence ordonne (non dcroissante) des artes provenant de E e e e e TANTQUE |S| = 1 FAIRE e <- head E // Larte de poids minimum e E <- tail E SI larte e relie deux sommets entre Si et Sj avec i = j ALORS e // On fusionne les sous-ensembles S <- S - {Si , Sj } U {Si U Sj } F <- F U {e} FIN FIN Soit S = {S0 } RETOURNER (S0 , F) FIN

Figure 4: Description de haut niveau de lalgorithme de Kruskal F <- F U {e} FIN Note : Dans lalgorithme de la Figure 4, head s retourne llment ` la tte de s, ee a e cest-`-dire le premier lment de s (donc head s = s[1]), alors que tail s retourne a ee la sous-squence qui contient les mmes lments que s sauf le premier lment (donc e e ee ee tail s = s[2..length(s)]). On a donc toujours que s = [head s] ++ tail s, ce qui peut aussi sexprimer par lquation suivante : s = add(head s, tail s). e Lalgorithme 4.2 du manuel (prsent aux pages 149150) permet de dterminer un e e e arbre de recouvrement minimum utilisant lalgorithme de Kruskal. Lalgorithme utilise une structure de donnes permettant de manipuler ecacement des sous-ensembles dise joints dindices. Ces oprations sont dcrites un peu plus bas (Section 4.5). e e Complexit de lalgorithme pour G = (V , E ) , o` |V | = n et |E | = m : e u 1. Temps pour eectuer le tri des artes : (m lg m). e Note : Comme dans lexemple du sac ` dos, on pourrait aussi utiliser une le de a priorit plutt quun tri complet. La complexit asymptotique rsultante serait la e o e e mme, mais le facteur de proportionalit serait infrieur. e e e 2. Initilialisation des n ensembles disjoints ` laide des oprations de manipulation a e de sous-ensembles disjoints : (n). 7

3. Temps ` lintrieur de la boucle TANTQUE : on a m itrations, et ` chaque itration a e e a e on utilise les oprations find, equal ou merge de manipulation de sous-ensembles e disjoints. La complexit de cette partie sera donc (m lg m) (voir plus bas, Sece tion 4.5, p. 13 : la complexit est indpendante du nombre ditems dans lensemble, e e mais dpend uniquement du nombre doprations eectues). e e e Parce que m n-1, cest donc le tri qui domine le temps dexcution (notons quon e aurait le mme rsultat si on utilisait une le de priorit). Donc, W (m, n) = (m lg m). e e e Toutefois, dans le pire cas, le nombre dartes m (n 2 ) (graphe complet = chaque e sommet est reli ` chacun des autres sommets). Le pire cas peut donc aussi tre exprim ea e e 2 lg n 2 ) = (n 2 lg n). par W (m, n) (n Preuve que lalgorithme de Prim produit un arbre optimal : Voir Lemme 4.2 (p. 151) et Thor`me 4.2 (p. 152) : encore bas sur la notion densemble prometteur, avec preuve e e e par induction sur les diverses itrations. e 4.1.3 Comparaison entre lalgorithme de Prim et celui de Kruskal

Algorithme de Prim : T (n) (n 2 ) Algorithme de Kruskal : W (m, n) (m lg m) et W (m, n) (n 2 lg n) Or, dans un graphe connexe, on a toujours la proprit suivante : ee n-1 m Donc : Si m est petit, alors lalgorithme de Kruskal sera prfrable. ee Si m est grand, alors lalgorithme de Prim sera prfrable. ee n(n-1) 2

4.2

Algorithme de Dijkstra pour les plus courts chemins

Section omise.

4.3

Ordonnancement de tches a

Section omise.

4.4

Approche vorace vs. approche de programmation dynamique : le probl`me du sac ` dos e a

Rappel : Le probl`me du sac ` dos est de maximiser le bnce pouvant tre obtenu e a e e e ` en remplissant un sac avec divers items. A chaque item est associ un bnce (un entier e e e positif) et un poids (un entier positif). Lobjectif est de remplir le sac a dos de faon a ` c ` maximiser le bnce, mais sans dpasser le poids maximum pouvant tre contenu dans e e e e le sac. 8

Dans la version fractionnaire de ce probl`me, il est permis de prendre une partie dun e item (par ex., on a trois kilos de sucre et on met seulement un kilo dans le sac). Dans la version 01, un item doit tre pris en entier ou pas du tout. e Formulation gnrale du probl`me : on suppose quon a n items. Soit e e e S wi pi W = {item1 , . . . , itemn } = poids de itemi = Bnce de itemi e e = poids maximum pouvant tre contenu dans le sac e

o` wi , pi et W sont des entiers positifs. u Le probl`me est de trouver un sous-ensemble A S tel que e pi est maximis sous la contrainte e
itemi A itemi A

wi W

Solution na (brute force) : essayer tous les ensembles possibles de W et, parmi tous ve ceux qui satisfont la contrainte, choisir celui qui maximise le bnce. e e Note : Dans ce qui suit, on suppose que la somme des poids des items est suprieure au e poids total W . Autrement . . . il ny a pas de probl`me (on peut tout prendre). e 4.4.1 Approche vorace au probl`me du sac ` dos 01 e a

Approches possibles (voir la solution pour le probl`me fractionnaire pour les dtails) : e e Choisir en minimisant le poids Choisir en maximisant le bnce e e ... Choisir en maximisant le rapport bnce/poids (bnce rsultant pour chaque e e e e e unit de poids) e Mais . . . si on utilise cette approche, la solution rsultante ne sera pas ncessairement e e optimale. Exemple (Figure 4.10, p. 167) : W = 30 S = {item1 , item2 , item3 } Poids : w1 = 5, w2 = 10, w3 = 20 Bnces : p1 = 50, p2 = 60, p3 = 140 e e Rapport bnce/poids : r1 = 10, r2 = 6, p3 = 7 e e Solution vorace vs. solution optimale : Solution vorace : Bnce rsultant = 190 (poids = 25, avec les items 1 et 3). e e e Autre solution (optimale) : Bnce rsultant = 200 (poids 30 avec les items 2 et e e e 3). 9

4.4.2

Approche vorace au probl`me du sac ` dos fractionnaire e a

Puisquon peut prendre des fractions ditems, si on a susamment ditems, alors on pourra toujours remplir compl`tement le sac. e Solution pour lexemple prcdent : 5 lbs 10 $/lb +20 lbs 7 $/lb +5 lbs 6 $/lb = 220$ e e
PROCEDURE BeneficeSac( W: Nat, poids, benefs: sequence{Nat} ): (set{Nat}, Nat) PRECONDITION length(poids) = length(benefs) = n n i=1 poids[i] > W DEBUT items <- Ordonner les items 1 ` n en ordre dcroissant de rapport bnce/poids a e e e benef <- 0 A <- {} w <- 0 TANTQUE w < W FAIRE i <- items[1] // i <- head items items <- items[2..lenth(items)] // items <- tail items A <- A U {i} w <- min{ poids[i], W-w } benef <- benef + w * benefs[i] / poids[i] w <- w + w FIN RETOURNER (A, benef) FIN

Figure 5: Algorithme vorace pour le probl`me du sac ` dos fractionnaire (premi`re e a e version informelle) Algorithme (premi`re version) : Figure 5. Cet algorithme eectue au pralable un tri des e e n items, tri qui seectue sur la base des quotients bnce/poids. Toutefois, eectuer e e un tel tri complet nest pas toujours ncessaire (par exemple, si le sac ne contient, e ultimement, que quelques uns des items parmi lensemble total).

Files de priorit et oprations associes e e e


Les oprations de manipulation dune le de priorit sont les suivantes : e e estVide() : la le de priorit est-elle vide? e inserer(k, e) : insertion de llment e ayant la cl k. ee e maxElement() : retourne llment dont la cl poss`de la valeur maximale. ee e e maxCle() : retourne la cl dont la valeur est maximale. e retirerMaxElement() : supprime de la le llment dont la cl poss`de la valeur ee e e maximale et retourne cet lment et la cl qui lui est associe. ee e e 10

PROCEDURE trier( items: sequence{Item} ): sequence{Item} DEBUT // On suppose quon doit trier en ordre croissant des cls (cle) associes aux items. e e fp <- new FilePriorite() POUR k <- 1 A length(items) FAIRE fp.inserer( cle(items[k]), items[k] ) FIN k <- 1 resultat <- [] TANTQUE NON fp.estVide() FAIRE (c, item) <- fp.retirerMaxElement() resultat <- [item] ++ resultat // resultat <- add(item, resultat) FIN RETOURNER resultat FIN

Figure 6: Tri dune squence ditems ` laide dune le de priorit e a e Exemple dutilisation = algorithme de tri avec une le de priorit : Figure 6. e La complexit de lalgorithme de tri rsultant dpend alors de la mise en oeuvre choisie e e e pour la le de priorit. e Complexit (pire cas) des oprations de manipulation dun le de priorit mise en e e e oeuvre avec un monceau (heap) : Dterminer si la le est vide : (1). e Identier llment ou la cl maximal : (1). ee e Insrer un item dans la le : (lg n). e Retirer llment ayant la cl maximale de la le : (lg n). ee e Lalgorithme de tri prsent plus haut sera donc, dans le pire cas, de complexit (lg n). e e e

Algorithme pour sac ` dos fractionnaire avec le de priorit a e


La gure 7 prsente une version rvise de lalgorithme pour le probl`me du sac ` dos e e e e a fractionnaire, cette fois en utilisant une le de priorit. e La complexit de lalgorithme vorace rsultant sera (n lg n). e e 4.4.3 Approche de programmation dynamique au probl`me du sac ` dos e a 01

Voir rsum du Chapitre 3. e e

11

PROCEDURE BeneficeSac( W: Nat, poids, benefs: sequence{Nat} ): (set{Nat}, Nat) PRECONDITION length(poids) = length(benefs) = n n i=1 poids[i] > W DEBUT ratios <- new FilePriorite() POUR i <- 1 A n FAIRE ratios.inserer( benefs[i]/poids[i], i ) FIN benef <- 0 A <- {} w <- 0 TANTQUE w < W FAIRE (r, i) <- ratios.retirerMaxElement() A <- A U {i} w <- min{ poids[i], W-w } benef <- benef + w * r w <- w + w FIN RETOURNER (A, benef) FIN

Figure 7: Algorithme vorace pour le probl`me du sac ` dos fractionnaire avec le de e a priorit e

12

4.5

Manipulation de sous-ensembles disjoints (relations dquivalence) e

Certains algorithmes, par exemple, lalgorithme de Kruskal, demandent de pouvoir manipuler les sous-ensembles disjoints dun ensemble de base. En dautres mots, tant e donn un ensemble de dpart U = {u1 , . . . , un }, on veut pouvoir manipuler ecacement e e ee un ensemble de sous-ensemble U1 , . . . , Uk tels que les proprits suivantes sont satisfaites (proprits qui dnissent, rappelons-le, une relation dquivalence entre les lments) : ee e e ee
k

Ui
i=1 k

= U = {}

Ui
i=1

De plus, on veut aussi tre capable deectuer les oprations suivantes de faon ecace : e e c Recherche : Etant donn un lment uj , on veut trouver lensemble Ui auquel il e ee appartient (identication de la classe dquivalence dun lment). e ee Fusion : Etant donn deux sous-ensembles Ui et Uj , on veut les fusionner en un e seul sous-ensemble (formation dune nouvelle classe dquivalence). e Comparaison : Etant donn deux sous-ensembles Ui et Uj , on veut pouvoir dtere e miner de faon ecace (temps constant) si ces deux sous-ensembles sont gaux c e (sils dnotent la mme classe dquivalence). e e e Initialisation : Au dpart, on veut faire en sorte que Ui = {ui } (chaque lment e ee est dans sa propre classe dquivalence). e Dans un tel type de donnes, les oprations cls ont donc lallure suivante (version du e e e manuel, dcrite plus en dtail a lannexe C) : e e ` initial (n) : cre n sous-ensembles disjoints, chacun contenant une valeur comprise e entre 1 et n (reprsentant donc les divers Ui = {ui }). e p = nd (i ) : p rf`re ` lensemble contenant llment dindex i (cest-`-dire, la ee a ee a classe dquivalence pour llment ui ). e ee merge(p, q) : fusionne les deux ensembles en un seul sous-ensemble. Apr`s lexcution, e e p et q rfrent alors au mme sous-ensemble. ee e equal (p, q) : retourne VRAI si et seulement si p et q rf`re au mme sous-ensemble ee e (dnotent la mme classe dquivalence). e e e La mise en oeuvre dcrite dans lannexe C du manuel utilise une structure de donnes e e appele une fort darbres inverses (un enfant pointe vers son parent, la racine pointant e e e simplement vers elle-mme). Une telle structure peut tre ralise ` laide dun tableau e e e e a ditems, donc pas ncessairement avec allocation dynamique et pointeurs (comme pour e un monceau, sauf que la structure, lorganisation des items est dirente). e Les dtails de la mise en oeuvre dune telle structure de donnes dpassent le cadre du e e e prsent cours (voir lexemple prsent en classe ; une prsentation plus dtaille serait e e e e e e 13

plutt le sujet du cours INF7341 Structures de donnes). On peut toutefois mentionner o e quune mise en oeuvre na peut conduire a des rsultats tels quune opration de ve ` e e recherche soit de temps linaire. Par contre, en sassurant par diverses techniques (fusion e qui tient compte de la taille des ensembles a fusionner et compression des chemins lors ` dune recherche) de minimiser le plus possible la hauteur des arbres inverss manipuls, e e on peut en arriver a une mise en oeuvre plus ecace. Plus prcisment, pour une srie ` e e e u de m oprations equal , nd ou merge, la complexit sera O(m lg m), o` la fonction e e lg m est dnie comme suit : e lg m = min{i : t(i ) m} t(i ) = 1 si i = 0 t(i-1) si i 1 2

Lanalyse dtaille de la complexit de cette structure de donnes et des oprations e e e e e associes requiert lutilisation dune technique appele analyse amortie. Dans une telle e e forme danalyse, on sintresse non pas strictement ` la complexit dune opration e a e e donne, mais plutt ` la complexit dune srie doprations. Intuitivement, ceci signie e o a e e e quon peut permettre quune opration donne soit un peu plus coteuse si on est assur e e u e que ce cot additionel pourra tre amorti sur lensemble des oprations. Dans le cas u e e prsent, la borne asymptotique ne porte donc pas sur un appel spcique ` une opration e e a e donne, mais porte plutt sur le cot pour excuter (apr`s lappel ` initial ) une srie e o u e e a e de m opration equal , nd ou merge, la borne tant alors de O(m lg m). e e Note : Dans le livre de Cormen, Leiserson et Rivest, la borne mentionne est plutt e o o ` O(m lg n). Toutefois, la construction de lensemble initial se fait plutt a laide de n appels a une fonction dinitialisation pour crer un ensemble singleton (plutt ` e o quavec un unique appel a initial ) et le nombre m doprations inclut aussi ces n appels ` e dinitialisation de lensemble. Le rsultat est donc quivalent. Notons aussi que lanalyse e e de la version plus ecace demande plusieurs pages (8) danalyse mathmatique dtaille, e e e et ce apr`s que les notions de base de lanalyse amortie aient dj` t prsentes dans e eaee e e un chapitre prcdent . . . e e Note : Dans le manuel (appendice C), la borne mentionne est plutt O(m lg m). Le e o dernier paragraphe de lannexe C mentionne toutefois lexistence de la technique de path compression, qui permet dobtenir une mise en oeuvre qui soit presque de temps linaire e en m (le nombre doprations). Cette mise en oeuvre avec path compression est bien e celle mentionne dans les paragraphes qui prc`dent. Pour obtenir la borne moins stricte e e e O(m lg m), il sut simplement de fusionner les arbres inverss de faon ` minimiser e c a la hauteur de larbre rsultant, ce qui se fait simplement en faisant pointer la racine du e plus petit arbre vers la racine du plus grand.

14

S-ar putea să vă placă și