2017-01-24 3 views
0

Ich lese the wiki page und verstehe nicht, warum es wichtig ist, eine kleinere Liste an eine größere anhängen.Verständnis Union finden

Hier, dass ein Teil des Algorithmus von der Wiki-Seite ist:

Angenommen, Sie eine Sammlung von Listen haben und jeder Knoten jeder Liste ein Objekt enthält, auf den Namen der Liste, die es gehört, und die Anzahl der Elemente in dieser Liste. Man nehme auch an, dass die Gesamtzahl von Elementen in allen Listen n ist (d. H. Es gibt insgesamt n Elemente). Wir möchten in der Lage sein, zwei dieser Listen zusammenzuführen und alle ihre Knoten zu aktualisieren, so dass sie immer noch den Namen der Liste enthalten, zu der sie gehören. Die Regel zum Zusammenführen der Listen A und B besteht darin, dass, wenn A größer als B ist, die Elemente von B in A zusammengeführt werden und die Elemente aktualisieren, die früher zu B gehörten, und umgekehrt.

Antwort

0

Dies beschreibt einen naiven Ansatz zur Durchführung der Aktualisierungsoperation, bei der Sie über alle Elemente in einer der Listen iterieren und die Beschriftung ändern.

Es wird schneller sein, über eine kürzere Liste zu iterieren, so dass es sinnvoll ist, die kleinere Liste in die größere Liste zusammenzuführen.

Beachten Sie, dass die Wiki-Seite weiterhin viel effizientere Methoden für eine disjunkte Set-Datenstruktur beschreibt, in der es keine Rolle mehr spielt, welche Liste länger ist.

0

Union-Find ist nur eine Möglichkeit für Sie, wer ist der "Führer" eines Satzes.

Beispiel: Angenommen, Sie haben 5 Personen A, B, C, D, E.

zunächst jeder auf seinem eigenen Satz beginnt, so dass Sie es wie dieser Code:

for each person in people: 
    dad[person] = person 

Auf diese Weise können Sie jede Person zum Anführer ihrer eigenen Gruppe machen.

das ist, was es aussehen sollte:

{A} {B} {C} {D} {E} 

die erste Operation ist in der Lage den Führer eines Satzes zu finden, und dieser Vorgang genannt find ist wir brauchen.

dann fallen wir in eine Eigenschaft: ein Führer ist jemand, der sein eigener Vater ist.

gibt es zwei Möglichkeiten, oder die Person ist ihr eigener Vater oder es ist nicht.

Wenn es ist, dann ist es der Anführer des Satzes.

Wenn es nicht ist, dann werden wir das Gleiche (wenn es sein eigener Vater ist) nach seinem Vater fragen, und so geht es.

können Sie es wie folgt Code:

find_leader_of(person P){ 
    if(dad[P] == P) return P 
    else return find_leader_of(dad[P]) 
} 

dann haben wir die union Betrieb, das ist nichts anderes als nur gesetzt, in einem 2 disjoints Sätze drehen.

nehme an, Sie haben diese Situation:

{A, B}  {C, D}   {E} 

und Sie tun union(B, D), was geschieht dann?

müssen Sie zuerst die Führer beider Sätze zu finden:

fst_leader = find_leader_of(B) 
snd_leader = find_leader_of(D) 

dann wählen Sie eines dieser Führer der Führer der anderen zu sein:

dad[snd_leader] = fst_leader 

und dies führt zu:

union(person P1, person P2){ 
    fst_leader = find_leader_of(P!) 
    snd_leader = find_leader_of(P2) 
    dad[snd_leader] = fst_leader 
} 

Es gibt andere Ansätze, um die gewerkschaftliche Suche zu verbessern und andere Wege zu wählen, wer der Anführer von wem ist, aber das sind die Grundlagen, die Sie verstehen müssen, um zu wissen, worum es beim Gewerkschaftsfund geht.

0

Wenn Sie den naiven Ansatz nicht verwenden möchten, sollten Sie sich den Hoshen-Kopelman-Algorithmus https://www.ocf.berkeley.edu/~fricke/projects/hoshenkopelman/hoshenkopelman.html ansehen, der eine amortisierte Komplexität von N * A aufweist (wobei A die inverse Ackerman-Funktion ist), die sich asymptotisch nähert Konstante 6). Mit anderen Worten, es ist WICKED FAST.

Wenn ich mich nicht irre, haben einige Leute die Gesamteffizienz beim Zusammenklappen der Bäume betrachtet - dh wann es am effizientesten ist. Ich kann Sie nicht auf diese Studien hinweisen, aber ich erinnere mich daran, sie vor einem Jahrzehnt in einem Lehrbuch gelesen zu haben.

Hoffe, das hilft.