disjoint-set data structure (tsz. disjoint-set data structures)
x
elem. → Visszaad egy képviselőt (representative), ami a halmaz azonosítója.x
és y
halmazait, amennyiben különbözőek. → Az x
és y
elemek képviselői egyesülnek.
A diszjunkt halmazokat gyökérfa-struktúrával reprezentálják:
find(x)
rekurzívan halad felfelé a fában.
A find(x)
művelet során az x
és minden őse közvetlenül a gyökérhez lesz kötve, így a későbbi find
műveletek gyorsabbak lesznek.
A union(x, y)
során a kisebb mélységű/elemszámú fát kapcsolják a nagyobbhoz, így elkerülhető a túlmély fa.
👉 A fenti két technika kombinációjával a műveletek átlagos futási ideje közelít az inverz Ackermann-függvényhez, ami kvázi-konstans idő.
int parent; // Minden elemhez egy szülő
// Inicializálás
void makeSet(int n) {
for (int i = 0; i < n; ++i)
parent = i;
}
// Find művelet path compression-nel
int find(int x) {
if (parent != x)
parent = find(parent);
return parent;
}
// Union művelet
void unionSets(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY)
parent = rootX;
}
A disjoint-set data structure kulcsfontosságú eszköz összefüggésvizsgálathoz és klaszterezéshez, különösen gráfalgoritmusokban. A find
és union
műveletek hatékony optimalizálása révén nagy adathalmazokon is gyors és skálázható megoldásokat tesz lehetővé.