Minimum Spanning Tree
Wat is MST? • Minimum spanning tree • De meest efficiënte manier vinden om een verbonden netwerk op te bouwen
Wat is een tree/boom?
Hoeveel kanten heeft een boom?
Definitie MST
Voorbeeld MST
MST als optimaliseringsprobleem
Bomen bouwen 1
Bomen bouwen 2
Hoe bepaal je een MST? • Algoritmische trukendoos: – Divide & Conquer • Verdeel de graaf in twee deelgraven? • Verbind de deel-MST’s met de lichtste kant? • Fail… – Dynamisch Programmeren
Hoe bepaal je een MST?
• DP heeft naast OSS ook overlapping subproblems nodig • Het kan wél, maar… • Het probleem heeft een greedy choice property!
Algoritme van Prim • Bouw de boom op door steeds 1 kant toe te voegen • Kies een beginknoop • Bekijk de knopen die je in 1 stap kunt bereiken • Kies de lichtste van de uitgaande kant • Je kiest steeds de lichtste boomverlatende kant
Algoritme van Prim
Implementatie van Prim • Hoe kun je snel de lichtste kant vinden? Priority Queue! • Representatie van het resultaat? Parent Pointers
Pseudocode van Prim foreach(Vertex v in graph.Vertices) v.Key = ∞; root.Key = 0; PQ = new PriorityQueue(graph.Vertices); while(!PQ.Empty) u = PQ.ExtractMin(); foreach(Vertex v in u.Neighbors) if(PQ.Contains(v) && w(u,v) < v.Key) v.Parent = u; PQ.DecreaseKey(v, w(u,v));
Algoritme van Prim Priority Queue B: 4 H: 8
Algoritme van Prim Priority Queue B: 4 C: 8 H: 8
Algoritme van Prim Priority Queue C: 8 I: 2 F: 4 D: 7 H: 8
Algoritme van Prim Priority Queue I: 2 F: 4 G: 6 D: 7 H: 8 H: 7
Algoritme van Prim
Pseudocode van Prim
Pseudocode van Prim Dijkstra
Bewijs van Prim
Algoritme van Kruskal
• Bekijk de kanten van licht naar zwaar • Voeg steeds de kant toe als hij geen cykel introduceert • Cykels testen: Union-Find! Sort(edges);foreach(Vertex v) MakeSet(v); foreach(Edge e) if(FindRep(e.A) ≠ FindRep(e.B)) resultaat.Add(e); Union(e.A, e.B);
Algoritme van Kruskal
Voorbeeld Kruskal HG IC GF AB CF IG CD HI AH BC DE FE
Voorbeeld Kruskal HG: A B C D E F GH I IC GF AB CF IG CD HI AH BC DE FE
Voorbeeld Kruskal HG: A B C D E F GH I IC: A B CI D E F GH GF AB CF IG CD HI AH BC DE FE
Voorbeeld Kruskal HG: A B C D E F GH I IC: A B CI D E F GH GF: A B CI D E FGH AB CF IG CD HI AH BC DE FE
Voorbeeld Kruskal HG: A B C D E F GH I IC: A B CI D E F GH GF: A B CI D E FGH AB: AB CI D E FGH CF IG CD HI AH BC DE FE
Voorbeeld Kruskal HG: A B C D E F GH I IC: A B CI D E F GH GF: A B CI D E FGH AB: AB CI D E FGH CF: AB CFGHI D E IG CD HI AH BC DE FE
Voorbeeld Kruskal HG: A B C D E F GH I IC: A B CI D E F GH GF: A B CI D E FGH AB: AB CI D E FGH CF: AB CFGHI D E IG: niks CD HI AH BC DE FE
Voorbeeld Kruskal HG: A B C D E F GH I IC: A B CI D E F GH GF: A B CI D E FGH AB: AB CI D E FGH CF: AB CFGHI D E IG: niks CD: AB CDFGHI E HI AH BC DE FE
Voorbeeld Kruskal HG: A B C D E F GH I IC: A B CI D E F GH GF: A B CI D E FGH AB: AB CI D E FGH CF: AB CFGHI D E IG: niks CD: AB CDFGHI E HI: niks AH BC DE FE
Voorbeeld Kruskal HG: A B C D E F GH I IC: A B CI D E F GH GF: A B CI D E FGH AB: AB CI D E FGH CF: AB CFGHI D E IG: niks CD: AB CDFGHI E HI: niks AH: ABCDFGHI E BC DE FE
Voorbeeld Kruskal HG: A B C D E F GH I IC: A B CI D E F GH GF: A B CI D E FGH AB: AB CI D E FGH CF: AB CFGHI D E IG: niks CD: AB CDFGHI E HI: niks AH: ABCDFGHI E BC: niks DE FE
Voorbeeld Kruskal HG: A B C D E F GH I IC: A B CI D E F GH GF: A B CI D E FGH AB: AB CI D E FGH CF: AB CFGHI D E IG: niks CD: AB CDFGHI E HI: niks AH: ABCDFGHI E BC: niks DE: ABCDEFGHI FE
Voorbeeld Kruskal HG: A B C D E F GH I IC: A B CI D E F GH GF: A B CI D E FGH AB: AB CI D E FGH CF: AB CFGHI D E IG: niks CD: AB CDFGHI E HI: niks AH: ABCDFGHI E BC: niks DE: ABCDEFGHI FE: niks
Correctheid van Kruskal
Is de MST uniek?
Kroegentocht of TSP • Travelling Salesman • Bepaal een volgorde (rondtocht) om zo snel mogelijk een aantal knopen te bezoeken in een graaf. • Handelsreiziger: wil zijn product in een aantal steden verkopen, wat is de kortste route. • Is een “moeilijk” probleem: NP-compleet • Waarschijnlijk kost het exponentiële tijd om op te lossen
TSP-Approximatie • Met behulp van MST kunnen we TSP benaderen
TSP-Approximatie
Prim VS Kruskal PrimKruskal DatastructuurPriority QueueUnion-Find Looptijd Extra ruimte
Conclusie