A diszjunkt halmazrendszer ( eng. disjoint-set , vagy union-find adatstruktúra ) egy olyan adatstruktúra , amely lehetővé teszi egy diszjunkt részhalmazokra osztott elemkészlet adminisztrálását. Ebben az esetben minden részhalmazhoz hozzá van rendelve a képviselője - ennek a részhalmaznak egy eleme. Egy absztrakt adatszerkezetet három műveletből álló halmaz határoz meg: .
Az összekapcsolt komponensek gráfokban való tárolására szolgál , különösen a Kruskal-algoritmusnak hasonló adatszerkezetre van szüksége a hatékony megvalósításhoz.
Legyen egy véges halmaz, amely nem metsző részhalmazokra ( osztályokra ) van felosztva :
.Minden részhalmazhoz hozzá van rendelve egy képviselő . A megfelelő diszjunkt halmazrendszer a következő műveleteket támogatja:
Egy triviális megvalósítás egy indextömbben tárolja az elemek és a képviselők tulajdonjogát . A gyakorlatban gyakrabban használnak facsoportokat . Ez jelentősen csökkentheti a Keresés művelethez szükséges időt . Ebben az esetben a reprezentáns a fa gyökerébe, az osztály többi eleme pedig az alatta lévő csomópontokba kerül.
Az Unió méret szerint , Magasság szerinti egység , Véletlenszerű unió heurisztika és útvonaltömörítés használható az egyesítési és keresési műveletek felgyorsításához .
Az Union-By-Size heurisztikában a művelet során a kisebb fa gyökere a nagyobb fa gyökere alá kerül. Ez a megközelítés megőrzi a fa egyensúlyát. Az egyes részfák mélysége nem haladhatja meg a . Ezzel a heurisztikával a legrosszabb eset keresési műveletének ideje ról -ra nő . A hatékony megvalósítás érdekében javasolt a fa csomópontjainak számát a gyökérben tárolni.
Az Union-By-Height heurisztika hasonló a Union-By-Size -hoz , de a méret helyett a fa magasságát használja.
A Random-Union heurisztika azt a tényt használja fel, hogy nem lehet több memóriát költeni a fa csomópontjainak elmentésére: elég véletlenszerűen kiválasztani a gyökért - ez a megoldás a véletlenszerű lekérdezésekhez olyan sebességet biztosít, amely összehasonlítható a többivel. megvalósítások. Ha azonban sok olyan lekérdezés van, mint a "nagy halmaz egyesítése kicsivel", akkor ez a heurisztika csak kétszeresére javítja a várható értéket (vagyis az átlagos futási időt), ezért nem ajánlott anélkül használni. az útvonal tömörítési heurisztika.
Az útvonal-tömörítési heurisztika a művelet felgyorsítására szolgál . Minden új keresésnél a gyökértől a kívánt elemig tartó útvonalon lévő összes elem a fa gyökere alá kerül. Ebben az esetben a Find művelet átlagosan működik , ahol az Ackerman függvény inverz függvénye . Ezzel jelentősen felgyorsíthatja a munkát, mivel a gyakorlatban használt összes értékhez 5-nél kisebb érték szükséges.
Megvalósítás C++ nyelven:
const int MAXN = 1000 ; int p [ MAXN ], rang [ MAXN ]; void MakeSet ( int x ) { p [ x ] = x ; rang [ x ] = 0 ; } int Keresés ( int x ) { return ( x == p [ x ] ? x : p [ x ] = Find ( p [ x ]) ); } void Unió ( int x , int y ) { if ( ( x = Keresés ( x )) == ( y = keresés ( y )) ) visszatérés ; if ( rang [ x ] < rang [ y ] ) p [ x ] = y ; else { p [ y ] = x ; if ( rang [ x ] == rang [ y ] ) ++ rang [ x ]; } }Megvalósítás Free Pascalban:
const MAX_N = 1000 ; var Szülő , Rank : LongInt [ 1..MAX_N ] tömbje ; _ _ _ eljáráscsere ( var x , y : LongInt ) ; _ var tmp : LongInt ; kezdődik tmp := x ; x : = y y := tmp ; vége ; eljárás MakeSet ( x : LongInt ) ; kezdődik Szülő [ x ] := x ; Helyezés [ x ] := 0 ; vége ; függvény Keresés ( x : LongInt ) : LongInt ; kezdődik if ( Szülő [ x ] <> x ) akkor Szülő [ x ] := Keresés ( Szülő [ x ] ) ; Kilépés ( szülő [ x ] ) ; vége ; eljárás Unió ( x , y : LongInt ) ; kezdődik x := Find ( x ) ; y := Find ( y ) ; if ( x = y ) akkor kilép () ; if ( Rang [ x ] < Rank [ y ] ) then swap ( x , y ) ; Szülő [ y ] := x ; if ( Rang [ x ] = Rang [ y ] ) akkor inc ( Ranghely [ x ] ) ; vége ;Adatstruktúrák | |
---|---|
Listák | |
fák | |
Számít | |
Egyéb |