La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Algoritmo di Kruskal Parte con tutti i vertici e nessun lato (sottografo aciclico, o foresta, ricoprente) Ordina i lati per costo non decrescente.

Presentazioni simili


Presentazione sul tema: "Algoritmo di Kruskal Parte con tutti i vertici e nessun lato (sottografo aciclico, o foresta, ricoprente) Ordina i lati per costo non decrescente."— Transcript della presentazione:

1 Algoritmo di Kruskal Parte con tutti i vertici e nessun lato (sottografo aciclico, o foresta, ricoprente) Ordina i lati per costo non decrescente Li aggiunge via via alla foresta, purché non creino cicli Kruskal(G,c) U = V; X =  For v = 1 to n do MakeSet(v) SortEdges(E) For each e = (u,v)  |X| do r = FindSet(u) s = FindSet(v) If r  s then X = X  {e*} Union(r,s) Un lato crea un ciclo quando i suoi estremi sono nella stessa componente connessa

2 Algoritmo di Kruskal: esecuzione
Kruskal(G,c) U = V; X =  For v = 1 to n do MakeSet(v) SortEdges(E) ... 1 v1 v5 v2 v3 v4 2 6 5 3 4 E = { [v1,v2], [v1,v5], [v2,v5], [v3,v5], [v2,v3], [v1,v3], [v4,v5], [v3,v4], [v1,v4] } p = [ ] rank = [ ]

3 Algoritmo di Kruskal: esecuzione
Kruskal(G,c) For each e = (u,v)  |X| do r = FindSet(u) s = FindSet(v) If r  s then X = X  {e*} Union(r,s) r = FindSet(v1) = v1 s = FindSet(v2) = v2 1 v1 v5 v2 v3 v4 2 6 5 3 4 E = { [v1,v2], [v1,v5], [v2,v5], [v3,v5], [v2,v3], [v1,v3], [v4,v5], [v3,v4], [v1,v4] } p = [ ] rank = [ ]

4 Algoritmo di Kruskal: esecuzione
Kruskal(G,c) For each e = (u,v)  |X| do r = FindSet(u) s = FindSet(v) If r  s then X = X  {e*} Union(r,s) r = FindSet(v1) = v1 s = FindSet(v5) = v5 1 v1 v5 v2 v3 v4 2 6 5 3 4 E = { [v1,v2], [v1,v5], [v2,v5], [v3,v5], [v2,v3], [v1,v3], [v4,v5], [v3,v4], [v1,v4] } p = [ ] rank = [ ]

5 Algoritmo di Kruskal: esecuzione
Kruskal(G,c) For each e = (u,v)  |X| do r = FindSet(u) s = FindSet(v) If r  s then X = X  {e*} Union(r,s) r = FindSet(v2) = v1 s = FindSet(v5) = v1 1 v1 v5 v2 v3 v4 2 6 5 3 4 E = { [v1,v2], [v1,v5], [v2,v5], [v3,v5], [v2,v3], [v1,v3], [v4,v5], [v3,v4], [v1,v4] } p = [ ] rank = [ ]

6 Algoritmo di Kruskal: esecuzione
Kruskal(G,c) For each e = (u,v)  |X| do r = FindSet(u) s = FindSet(v) If r  s then X = X  {e*} Union(r,s) r = FindSet(v3) = v3 s = FindSet(v5) = v1 1 v1 v5 v2 v3 v4 2 6 5 3 4 E = { [v1,v2], [v1,v5], [v2,v5], [v3,v5], [v2,v3], [v1,v3], [v4,v5], [v3,v4], [v1,v4] } p = [ ] rank = [ ]

7 Algoritmo di Kruskal: esecuzione
Kruskal(G,c) For each e = (u,v)  |X| do r = FindSet(u) s = FindSet(v) If r  s then X = X  {e*} Union(r,s) r = FindSet(v2) = v1 s = FindSet(v3) = v1 1 v1 v5 v2 v3 v4 2 6 5 3 4 E = { [v1,v2], [v1,v5], [v2,v5], [v3,v5], [v2,v3], [v1,v3], [v4,v5], [v3,v4], [v1,v4] } p = [ ] rank = [ ]

8 Algoritmo di Kruskal: esecuzione
Kruskal(G,c) For each e = (u,v)  |X| do r = FindSet(u) s = FindSet(v) If r  s then X = X  {e*} Union(r,s) r = FindSet(v1) = v1 s = FindSet(v3) = v1 1 v1 v5 v2 v3 v4 2 6 5 3 4 E = { [v1,v2], [v1,v5], [v2,v5], [v3,v5], [v2,v3], [v1,v3], [v4,v5], [v3,v4], [v1,v4] } p = [ ] rank = [ ]

9 Algoritmo di Kruskal: esecuzione
Kruskal(G,c) For each e = (u,v)  |X| do r = FindSet(u) s = FindSet(v) If r  s then X = X  {e*} Union(r,s) r = FindSet(v4) = v4 s = FindSet(v5) = v1 1 v1 v5 v2 v3 v4 2 6 5 3 4 E = { [v1,v2], [v1,v5], [v2,v5], [v3,v5], [v2,v3], [v1,v3], [v4,v5], [v3,v4], [v1,v4] } p = [ ] rank = [ ] |X| = n-1

10 Correttezza dell’algoritmo di Kruskal
Per assurdo, sia T(V,X) l’albero costruito dall’algoritmo di Kruskal e T*(V,X*) un albero ottimo Consideriamo il primo lato e  X, ma  X* Se e  X, significa che è stato scartato perché creava un ciclo con i lati già inseriti In tal caso, non può appartenere a X*, che contiene tutti i lati già inseriti, ma non contiene cicli

11 Complessità dell’algoritmo di Kruskal
ordinamento degli m lati: O(m log m)  O(m log n2) == O(m log n) verifica di aciclicità: O(log n) per ogni lato  complessità totale: O(m log n) Questa seconda operazione si può migliorare usando la compressione dei cammini, cioè sfruttando le chiamate a FindSet per far sì che tutti gli elementi della catena puntino direttamente quello rappresentativo La singola FindSet rallenta, la lunghezza d delle catene diventa quasi sempre 1: O(log n) diventa O(a(n))  O(1)


Scaricare ppt "Algoritmo di Kruskal Parte con tutti i vertici e nessun lato (sottografo aciclico, o foresta, ricoprente) Ordina i lati per costo non decrescente."

Presentazioni simili


Annunci Google