120 likes | 280 Views
Algoritmi per il calcolo di MST: uso di code unificabili. Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro. Alberi di copertura minima (MST). G = ( V , E ) sia un grafo non orientato, con archi pesati w : E ! ;
E N D
Algoritmi per il calcolo di MST:uso di code unificabili Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro AlgoLab - MST code binomiali
Alberi di copertura minima (MST) G = (V, E) sia un grafo non orientato, con archi pesati w: E!; T = (V, A), dove AµE, è un albero di copertura minima (MST) di G se: • Tè aciclico (dunque un albero): una copertura di G; • w(T) = å(u, v) 2Aw(u,v) è minimo tra tutte le coperture di G. 8 7 b c d 4 9 2 4 14 a 11 i e 7 6 8 10 w(T) = 37 h g f 1 2 AlgoLab - MST code binomiali
Schema degli algoritmi greedy per MST Generic-MST (G) 1. AÃ; 2. whileA non forma una copertura 3. do cerca (u, v) 2E[G] nA che sia safe per A 4. AÃA[ {(u, v)} 5. returnA L’arco (u, v) è safe per A se esiste un MST T per G t.c. a) AµT b) (u, v) 2TnA AlgoLab - MST code binomiali
Tagli e “safe edges” • Un taglio (cut) di Gè una partizione {S, V[G] nS} di V[G] • Un arco (u, v) 2E[G] scavalca (crosses) {S, V[G] nS} se: {u, v} Å S ¹; Æ {u, v} ÅV[G] n S ¹; • Un taglio rispettaA se nessun (u, v) 2A lo scavalca Teorema.Se A è incluso in un MST per G, {S, V[G] nS} è un taglio di G che rispetta A, allora un arco (u, v) 2E[G] t.c. w(u, v) = min{w(a, b) | (a, b) scavalca {S, V[G] nS}} è safe per A. AlgoLab - MST code binomiali
MST-Mergeable-Heap MST-Mergeable-Heap(G) // G grafo pesato, non orientato, connesso 1. Tà // grafo non orientato aciclico, inizialmente vuoto 2. for ogni vertice vi2V[G] 3. doViÃ{vi} 4. Eià {(vi , v) 2E[G]} 5. while esiste più di un Vi 6. do scegli un Vi 7. estrai da Ei un arco di peso minimo (u, v) 8. siano u2Vi, v2Vj 9 if i¹j 10. thenTÃT[ {(u, v)} 11. ViÃVi[Vj , ditruggendo Vj 12. EiÃEi[Ej AlgoLab - MST code binomiali
Correttezza Se la partizione P ha più di un elemento ed A è l’insieme degli archi correntemente in T,allora per ogni Vi2P: 1) {Vi, V[G] nVi} rispettaA 2) 9(u, v) 2Ei t.c. (u, v) scavalca {Vi, V[G] nVi} Quindi: a) Ei¹; b) sebbene l’arco di peso minimo (u, v) estratto alla linea 7 non sia necessariamente quello che scavalca il taglio {Vi, V[G] nVi}, se alla linea 9 i¹j allora w(u, v) è minimo tra i pesi degli archi che scavalcano il taglio: dunque (per il teorema) è safe per A c) quando |P| = 1, V[G] = V[T] e dunque T è un MST per G. AlgoLab - MST code binomiali
Pseudocodifica MST-Mergeable-Heap(G) 1. TÃEmpty-Graph (), PÃEmpty-Partition () 2. for ogni vertice vi2V[G] 3. doViÃMake-Set (P, vi) 4. EiÃMake-Heap () 5. for ogni (vi , v) 2E[G] 6. doinfo[x] à (vi , v) 7. key[x] = w (vi , v) 8. Binomial-Heap-Insert (Ei, x) 9. while esiste più di un Vi2P 11. do scegli un Vi2P 12. (u, v) ÃBinomial-Heap-Extract-Min (Ei) 13. aÃFind-Set (u), bÃFind-Set (v) 14 if a¹b 15. thenTÃT[ {(u, v)} 16. Union (P, a, b) 17. Eaà Binomial-Heap-Union (Ea, Eb) AlgoLab - MST code binomiali
Note sulla realizzazione in Java (1) • Estendiamo Graph con la classe UnorderedGraph: • aggiunge un campo private int Totalweight; // somma dei pesi degli archi • aggiunge un metodo public int getTotalweight() // ritorna il val. Ccorrente di Totalweight • ridefinisce il metodo public void addArc (int i, int j, int weight) // aggiunge l'arco non orientato {i, j} di peso // weight, ed incrementa Totalweight • ospita il metodopubblico MSTMergeableHeap () AlgoLab - MST code binomiali
Note sulla realizzazione in Java (2) • Realizziamo la partizione P sull’insieme degli indici del vettore Graph.vertices, ossia {0, … , Graph.cardVertexes()-1} usando DisjointSetsOfInt. • Modifichiamo DisjointSetsOfIntper poter sapere quando la cardinalità di P è 1: • aggiungiamo un campo privato private int card; // cardinalità della partizione • ed un metodo pubblico che lo ispeziona public int Cardinality () AlgoLab - MST code binomiali
Note sulla realizzazione in Java (3) • Per avere code di archi modifichiamo MergeableQueuein modo da trattare chiavi di tipo Comparable, usando il metodo compareTo dovunque occorra confrontare due chiavi • Per realizzare le code unificabili Eied associarle agli elementi Vi di P utilizziamo un array MergeableQueue edgesSet[] = new MergeableQueue[cardVertexes()]; ed usiamo gli indici dei vertici per associare ad ogni rappresentante di un elemento in P la relativa coda di archi. AlgoLab - MST code binomiali
Note sulla realizzazione in Java (4) • Per gli archi usiamo una classe Edge, privata e interna a Graph, avente i campi: int fst, snd; // indici dei vertici in Graph.vertices int weight; // peso dell’arco Per essere trattata come campo chiave in una coda di priorità, la classe implementa Comparable ed ha quindi un metodo public int compareTo (Object o) // ritorna –1 se this < o, 0 se == o, 1 se > o // supponendo o di classe Edge, e facendo il confronto // sul campo weight AlgoLab - MST code binomiali
Riferimenti • Basato sul testo: Intoduction to Algorithms, di Cormen et alii. • Gli algoritmi MST sono illustrati nel cap. 24 eedl testo di Cormen. • L’algoritmo MST-Mergeable-Heapè l’esercizio 20-2 del testo di Cormen. • Le funzioni utilizzate nella pseudocodifica sono illustrate nei capitoli 20 (code unificabili con alberi binomiali) e 22 (insiemi disgiunti) dello stesso testo. AlgoLab - MST code binomiali