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 Li aggiunge.

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 Li aggiunge."— 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 Un lato crea un ciclo quando i suoi estremi sono nella stessa componente connessa 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)

2 Algoritmo di Kruskal: esecuzione 1 v1v1 v5v5 v2v2 v3v3 v4v Kruskal(G,c) U = V; X = For v = 1 to n do MakeSet(v) SortEdges(E)... p = [ ] rank = [ ] E = { [v 1,v 2 ], [v 1,v 5 ], [v 2,v 5 ], [v 3,v 5 ], [v 2,v 3 ], [v 1,v 3 ], [v 4,v 5 ], [v 3,v 4 ], [v 1,v 4 ] }

3 Algoritmo di Kruskal: esecuzione 1 v1v1 v5v5 v2v2 v3v3 v4v p = [ ] rank = [ ] E = { [v 1,v 2 ], [v 1,v 5 ], [v 2,v 5 ], [v 3,v 5 ], [v 2,v 3 ], [v 1,v 3 ], [v 4,v 5 ], [v 3,v 4 ], [v 1,v 4 ] } 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(v 1 ) = v 1 s = FindSet(v 2 ) = v 2

4 Algoritmo di Kruskal: esecuzione 1 v1v1 v5v5 v2v2 v3v3 v4v p = [ ] rank = [ ] E = { [v 1,v 2 ], [v 1,v 5 ], [v 2,v 5 ], [v 3,v 5 ], [v 2,v 3 ], [v 1,v 3 ], [v 4,v 5 ], [v 3,v 4 ], [v 1,v 4 ] } 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(v 1 ) = v 1 s = FindSet(v 5 ) = v 5

5 Algoritmo di Kruskal: esecuzione 1 v1v1 v5v5 v2v2 v3v3 v4v p = [ ] rank = [ ] E = { [v 1,v 2 ], [v 1,v 5 ], [v 2,v 5 ], [v 3,v 5 ], [v 2,v 3 ], [v 1,v 3 ], [v 4,v 5 ], [v 3,v 4 ], [v 1,v 4 ] } 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(v 2 ) = v 1 s = FindSet(v 5 ) = v 1

6 Algoritmo di Kruskal: esecuzione 1 v1v1 v5v5 v2v2 v3v3 v4v p = [ ] rank = [ ] E = { [v 1,v 2 ], [v 1,v 5 ], [v 2,v 5 ], [v 3,v 5 ], [v 2,v 3 ], [v 1,v 3 ], [v 4,v 5 ], [v 3,v 4 ], [v 1,v 4 ] } 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(v 3 ) = v 3 s = FindSet(v 5 ) = v 1

7 Algoritmo di Kruskal: esecuzione 1 v1v1 v5v5 v2v2 v3v3 v4v p = [ ] rank = [ ] E = { [v 1,v 2 ], [v 1,v 5 ], [v 2,v 5 ], [v 3,v 5 ], [v 2,v 3 ], [v 1,v 3 ], [v 4,v 5 ], [v 3,v 4 ], [v 1,v 4 ] } 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(v 2 ) = v 1 s = FindSet(v 3 ) = v 1

8 Algoritmo di Kruskal: esecuzione 1 v1v1 v5v5 v2v2 v3v3 v4v p = [ ] rank = [ ] E = { [v 1,v 2 ], [v 1,v 5 ], [v 2,v 5 ], [v 3,v 5 ], [v 2,v 3 ], [v 1,v 3 ], [v 4,v 5 ], [v 3,v 4 ], [v 1,v 4 ] } 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(v 1 ) = v 1 s = FindSet(v 3 ) = v 1

9 Algoritmo di Kruskal: esecuzione 1 v1v1 v5v5 v2v2 v3v3 v4v p = [ ] rank = [ ] E = { [v 1,v 2 ], [v 1,v 5 ], [v 2,v 5 ], [v 3,v 5 ], [v 2,v 3 ], [v 1,v 3 ], [v 4,v 5 ], [v 3,v 4 ], [v 1,v 4 ] } 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(v 4 ) = v 4 s = FindSet(v 5 ) = v 1 |X| = n-1

10 Per assurdo, sia T(V,X) lalbero costruito dallalgoritmo 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 Correttezza dellalgoritmo di Kruskal

11 Complessità dellalgoritmo di Kruskal ordinamento degli m lati: O(m log m) O(m log n 2 ) == 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( (n)) O( )


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 Li aggiunge."

Presentazioni simili


Annunci Google