www.wikidata.de-de.nina.az
Eine Union Find Datenstruktur verwaltet die Partition einer Menge Der abstrakte Datentyp wird durch die Menge der drei Operationen Union Find Make Set gebildet Union Find Strukturen dienen zur Verwaltung von Zerlegungen in disjunkte Mengen Dabei bekommt jede Menge der Zerlegung ein kanonisches Element zugeordnet welches als Name der Menge dient Union vereinigt zwei solche Mengen Find x bestimmt das kanonische Element derjenigen Menge die x enthalt und Make Set erzeugt eine Elementarmenge x mit dem kanonischen Element x Inhaltsverzeichnis 1 Definition 2 Implementierung 3 Heuristiken 3 1 Union by size 3 2 Union by rank 3 2 1 Pseudocode 3 3 Pfadkompression 3 3 1 Maximale Verkurzung Wegkompression 3 3 2 Pseudocode 4 Aufteilungsmethode splitting 4 1 Halbierungsmethode halving 5 Laufzeiten 6 Anwendungen 7 Weblinks 8 EinzelnachweiseDefinition BearbeitenEine endliche Menge S displaystyle S nbsp sei in die disjunkten Klassen X i displaystyle X i nbsp partitioniert S X 0 X 1 X 2 X k displaystyle S X 0 uplus X 1 uplus X 2 uplus ldots uplus X k nbsp mit X i X j i j 0 1 k i j displaystyle X i cap X j varnothing quad forall i j in lbrace 0 1 ldots k rbrace i neq j nbsp Zu jeder Klasse X i displaystyle X i nbsp wird ein Reprasentant r i X i displaystyle r i in X i nbsp ausgewahlt Die zugehorige Union Find Struktur unterstutzt die folgenden Operationen effizient Init S displaystyle S nbsp Initialisiert die Struktur und bildet fur jedes x S displaystyle x in S nbsp eine eigene Klasse mit x displaystyle x nbsp als Reprasentant Union r displaystyle r nbsp s displaystyle s nbsp Vereinigt die beiden Klassen die zu den beiden Reprasentanten r displaystyle r nbsp und s displaystyle s nbsp gehoren und bestimmt r displaystyle r nbsp zum neuen Reprasentanten der neuen Klasse Find x displaystyle x nbsp Bestimmt zu x S displaystyle x in S nbsp den eindeutigen Reprasentanten zu dessen Klasse x displaystyle x nbsp gehort Implementierung BearbeitenEine triviale Implementierung speichert die Zugehorigkeiten zwischen den Elementen aus S displaystyle S nbsp und den Reprasentanten r i displaystyle r i nbsp in einem Array Fur kurzere Laufzeiten werden jedoch in der Praxis Mengen von Baumen verwendet Dabei werden die Reprasentanten in den Wurzeln der Baume gespeichert die anderen Elemente der jeweiligen Klasse in den Knoten darunter Union x displaystyle x nbsp y displaystyle y nbsp Hangt die Wurzel des niedrigeren Baumes als neues Kind unter die Wurzel des hoheren Baumes gewichtete Vereinigung Falls nun x displaystyle x nbsp Kind von y displaystyle y nbsp ist werden x displaystyle x nbsp und y displaystyle y nbsp vertauscht Find x displaystyle x nbsp Wandert vom Knoten x displaystyle x nbsp aus den Pfad innerhalb des Baumes nach oben bis zur Wurzel und gibt diese als Ergebnis zuruck Heuristiken BearbeitenUm die Operationen Find und Union zu beschleunigen gibt es die Heuristiken union by size union by rank Rang und Grossenheuristik und Pfadkompression wobei sich union by size und union by rank gegenseitig ausschliessen und union by rank oft in Kombination mit Pfadkompression verwendet wird Union by size Bearbeiten Bei der Operation Union r s wird der Baum der in Summe weniger Knoten hat sprich kleiner ist unter den grosseren Baum gehangt Damit verhindert man dass einzelne Teilbaume zu Listen entarten konnen wie bei der naiven Implementation r wird in jedem Fall Wurzel des neuen Teilbaums Die Tiefe eines Teilbaums T kann damit nicht grosser als log T displaystyle log left T right nbsp werden Mit dieser Heuristik verringert sich die Worst Case Laufzeit von Find von O n displaystyle O n nbsp auf O log n displaystyle O log n nbsp Fur eine effiziente Implementation fuhrt man bei jeder Wurzel die Anzahl der Elemente im Teilbaum mit Union by rank Bearbeiten Wird ausschliesslich die Heuristik union by rank verwendet entspricht der Rang rank einer Wurzel der Hohe ihres Unterbaumes Es wird stets der Baum mit dem niedrigeren Rang dem mit dem hoheren angehangt Bei gleichem Rang kann die Verkettung der Baume beliebig gewahlt werden Somit kann der Rang eines Knoten nur wachsen wenn zwei Baume des gleichen Rangs aneinander gehangt werden Daraus folgt insbesondere Knoten ohne Kinder haben den Rang 0 Wenn die zu kombinierenden Baume den gleichen Rang haben ist der Rang der resultierenden Baumes um 1 grosserMan kann zur weiteren Effizienzsteigerung union by rank in Kombination mit Pfadkompression verwenden In diesem Fall wird deutlich weshalb die Bezeichnung des Rangs anstelle der der Tiefe verwendet wird Die Pfadkompression verringert die Hohe von Baumen wahrend ihr Rang bestehen bleibt Siehe auch Pfadkompression 1 2 Pseudocode Bearbeiten function Union x y Knoten durch die Wurzeln des Baums ersetzen x Find x y Find y if x y Wenn x und y schon zur selben Menge gehoren wird die Funktion verlassen return if x rank lt y rank Wenn der Rang von x kleiner als der Rang von y ist wird y zur neuen Wurzel x parent y else if x rank gt y rank Wenn der Rang von x grosser als der Rang von y ist wird x zur neuen Wurzel y parent x else Wenn die Range gleich sind wird y zur neuen Wurzel und der Rang von y inkrementiert x parent y y rank y rank 1 Pfadkompression Bearbeiten Um spatere Find x Suchvorgange zu beschleunigen versucht man die Wege vom besuchten Knoten zur zugehorigen Wurzel zu verkurzen Maximale Verkurzung Wegkompression Bearbeiten Nach dem Ausfuhren von Find x werden alle Knoten auf dem Pfad von x zur Wurzel direkt unter die Wurzel gesetzt Man beachte hierbei dass die Operation Union x y die Operation Find x verwendet Dieses Verfahren bringt im Vergleich zu den beiden folgenden den grossten Kostenvorteil fur nachfolgende Aufrufe von Find fur einen Knoten im gleichen Teilbaum Zwar muss dabei jeder Knoten auf dem Pfad zwischen Wurzel und x zweimal betrachtet werden fur die asymptotische Laufzeit ist das jedoch egal Pseudocode Bearbeiten function Find x if x parent x x parent Find x parent return x parent else return x Aufteilungsmethode splitting BearbeitenWahrend des Durchlaufes lasst man jeden Knoten auf seinen bisherigen Grossvater zeigen falls vorhanden Damit wird ein durchlaufender Pfad in zwei der halben Lange zerlegt Halbierungsmethode halving Bearbeiten Wahrend des Durchlaufes lasst man jeden zweiten Knoten auf seinen bisherigen Grossvater zeigen Diese Methoden haben beide dieselben amortisierten Kosten wie die oberste Kompressionsmethode Knoten unter die Wurzel schreiben Alle Kompressionsmethoden beschleunigen zukunftige Find x Operationen Laufzeiten BearbeitenUnion Find Datenstrukturen ermoglichen die Ausfuhrung der obigen Operationen mit den folgenden Laufzeiten n S displaystyle n left S right nbsp Triviale Implementierung mit einem Array A A i x Knoten i liegt in der Menge x worst case Find O 1 displaystyle O 1 nbsp Union O n displaystyle O n nbsp Implementierung mit Baumen ohne Heuristiken Find O n displaystyle O n nbsp Union O n displaystyle O n nbsp mit Union By Size worst case Find O log n displaystyle O log n nbsp Union O 1 displaystyle O 1 nbsp mit Union By Size Pfadkompression worst case Find O log n displaystyle O log n nbsp Union O 1 displaystyle O 1 nbsp mit Union By Size Pfadkompression Folge von m Find und n 1 Union Operationen O n m a n displaystyle O left n m cdot alpha n right nbsp Dabei ist a n displaystyle alpha n nbsp die Umkehrfunktion der Ackermannfunktion A n n displaystyle A n n nbsp Sie wachst sehr langsam und ist fur alle praktischen Eingaben n lt 10 80 displaystyle n lt 10 80 nbsp kleiner als 5 Im Jahr 1977 hat Robert Tarjan gezeigt dass fur eine Sequenz m Find und n 1 Union Operationen jede Datenstruktur im Pointer Maschinen Modell eine Laufzeit von W n m a n displaystyle Omega left n m cdot alpha n right nbsp benotigt 3 Fredman und Saks haben 1989 gezeigt dass diese untere Schranke auch im allgemeineren Cell Probe Modell gilt 4 Daraus folgt dass die Datenstruktur mit Union By Size und Pfadkompression eine asymptotisch optimale Laufzeit besitzt und es keine Union Find Datenstruktur geben kann die sowohl Find als auch Union amortisiert in O 1 ausfuhrt Anwendungen BearbeitenUnion Find Strukturen eignen sich gut um Zusammenhangskomponenten von Graphen zu verwalten Union Find Strukturen konnen auch genutzt werden um effizient herauszufinden ob ein Graph Zyklen enthalt Das folgende Computerprogramm in der Programmiersprache C zeigt die Implementierung eines ungerichteten Graphen mit einem Array von Kanten Der ungerichtete Graph wird als Datentyp UndirectedGraph deklariert Bei der Ausfuhrung des Programms wird die Methode main verwendet das auf der Konsole ausgibt ob der gegebene Graph Zyklen enthalt Die Funktion unionSubsets verwendet union by rank um zwei Teilmengen von Kanten des Graphen zu vereinigen 5 include lt iostream gt using namespace std Deklariert den Datentyp fur die Kanten des Graphen struct Edge int startIndex endIndex Deklariert den Datentyp fur den ungerichteten Graphen struct UndirectedGraph int numberOfVertices numberOfEdges Edge edges Pointer auf das Array fur die Kanten Deklariert den Datentyp fur Teilmengen der Kantenmenge des ungerichteten Graphen struct subset int parent int rank Diese Funktion erzeugt einen ungerichteten Graphen struct UndirectedGraph createGraph int numberOfVertices int numberOfEdges struct UndirectedGraph undirectedGraph new UndirectedGraph undirectedGraph gt numberOfVertices numberOfVertices undirectedGraph gt numberOfEdges numberOfEdges undirectedGraph gt edges new Edge numberOfEdges return undirectedGraph Diese rekursive Funktion gibt den Index der Wurzel der Teilmenge mit dem Index i zuruck int find subset subsets int i Setzt Index der Wurzel auf den Index der Wurzel der Teilmenge mit dem Index i if subsets i parent i subsets i parent find subsets subsets i parent Rekursiver Aufruf der Funktion return subsets i parent Diese Methode bildet die Vereinigungsmenge der zwei Teilmengen mit den Indexen index1 und index2 void unionSubsets subset subsets int index1 int index2 int newIndex1 find subsets index1 Index der Teilmenge mit dem Index index1 int newIndex2 find subsets index2 Index der Teilmenge mit dem Index index2 Hangt den Teilbaum mit dem niedrigeren Rang unter die Wurzel des Baums mit dem hoheren Rang if subsets newIndex1 rank lt subsets newIndex2 rank subsets newIndex1 parent newIndex2 else if subsets newIndex1 rank gt subsets newIndex2 rank subsets newIndex2 parent newIndex1 else Wenn die Teilbaume denselben Rang haben wird der Rang des einen Baums erhoht und der andere Baum unter die Wurzel des anderen Baums gehangt subsets newIndex2 parent newIndex1 subsets newIndex1 rank Diese Methode pruft ob der Graph Zyklen enthalt bool containsCycle struct UndirectedGraph graph int numberOfVertices graph gt numberOfVertices int numberOfEdges graph gt numberOfEdges Edge edges graph gt edges Pointer auf das Array fur die Kanten subset subsets new subset numberOfVertices Deklariert ein Array fur die Teilmengen der Kantenmenge for int i 0 i lt numberOfVertices i for Schleife die Teilmengen mit einzelnen Kanten erzeugt subsets i parent i subsets i rank 0 for int i 0 i lt numberOfEdges i foreach Schleife die alle Kanten durchlauft Edge nextEdge edges i Weist die verbleibende Kante mit dem kleinsten Kantengewicht zu und erhoht den Kantenindex fur die nachste Iteration um 1 int index1 find subsets nextEdge startIndex Index der Wurzel der Teilmenge mit dem Index nextEdge startIndex int index2 find subsets nextEdge endIndex Index der Wurzel der Teilmenge mit dem Index nextEdge endIndex if index1 index2 Wenn die Indexe der Wurzeln also auch die Mengen ubereinstimmen enthalt der Graph einen Zyklus return true unionSubsets subsets index1 index2 return false Hauptfunktion die das Programm ausfuhrt int main int numberOfVertices 3 int numberOfEdges 3 Erzeugt den ungerichteten Graphen mit den gegebenen Kanten struct UndirectedGraph undirectedGraph createGraph numberOfVertices numberOfEdges Initialisiert das Array mit 3 Kanten Edge edges undirectedGraph gt edges edges 0 startIndex 0 edges 0 endIndex 1 edges 1 startIndex 1 edges 1 endIndex 2 edges 2 startIndex 0 edges 2 endIndex 2 if containsCycle undirectedGraph Aufruf der Methode cout lt lt Der Graph enthalt Zyklen lt lt endl Ausgabe auf der Konsole else cout lt lt Der Graph enthalt keine Zyklen lt lt endl Ausgabe auf der Konsole Der Algorithmus von Kruskal erfordert beispielsweise eine solche Datenstruktur um effizient implementiert werden zu konnen Weblinks BearbeitenDemonstration von Union FindEinzelnachweise Bearbeiten Disjoint Set Union Find Algorithm Union by rank and path compression In algorithms tutorialhorizon com englisch Disjoint set data structure Memento des Originals vom 2 Dezember 2016 im Internet Archive nbsp Info Der Archivlink wurde automatisch eingesetzt und noch nicht gepruft Bitte prufe Original und Archivlink gemass Anleitung und entferne dann diesen Hinweis 1 2 Vorlage Webachiv IABot www mathblog dk In mathblog dk Robert E Tarjan A class of algorithms which require nonlinear time to maintain disjoint sets In Journal of Computer and System Sciences 18 Jahrgang Nr 2 1979 S 110 127 doi 10 1016 0022 0000 79 90042 4 englisch M Fredman M Saks Saks The cell probe complexity of dynamic data structures Proceedings of the Twenty First Annual ACM Symposium on Theory of Computing Mai 1989 S 345 354 doi 10 1145 73007 73040 englisch Union Find Algorithm Set 2 Union By Rank and Path Compression In GeeksforGeeks englisch Abgerufen von https de wikipedia org w index php title Union Find Struktur amp oldid 233209430