El bosque de conjuntos disjuntos es una estructura de datos en forma de árbol para conjuntos disjuntos . (a veces llamado Sistema de conjuntos disjuntos )
Cada conjunto se representa como un árbol enraizado . En un bosque de conjuntos disjuntos, cada nodo contiene un elemento de conjunto y apunta solo a su nodo principal. La raíz de cada árbol contiene un representante y es el padre de sí mismo.
Las operaciones sobre el bosque de conjuntos disjuntos se realizan de la siguiente manera:
MAKE_SET: crea un árbol con un nodo.
FIND_SET: nos movemos a lo largo de los enlaces principales hasta la raíz del árbol.
UNIÓN: establece el puntero de la raíz de un árbol en la raíz de otro.
Asociación por rango. La idea de la heurística es que cuando se realiza la operación UNION, la altura del árbol resultante, si es posible, no aumenta. Para ello se utiliza el rango característico de cada raíz, que es el límite superior de la altura del nodo. La operación MAKE_SET crea una raíz con rango 0. La operación UNION, que en este caso se llama unión por rango, funciona de la siguiente manera:
Compresión de ruta. La heurística durante la operación FIND_SET hace que cada nodo (que se encuentra al subir a la raíz) apunte directamente a la raíz. La compresión de rutas no cambia los rangos de los nodos.
Considere un ejemplo de implementación de un bosque de conjuntos disjuntos. En el arreglo p almacenaremos un enlace al nodo padre, y en el arreglo r el rango del vértice.
operación MAKE_SET(x) p[x] = x r[x] = 0 operación FIND_SET(x) si x ≠ p[x] entonces p[x] = ENCONTRAR_CONJUNTO(p[x]) devolver p[x] operación UNION(x, y) si r[x] > r[y] entonces p[y] = x más p[x] = y si r[x] = r[y] entonces r[y] = r[y] + 1Cuando se aplican por separado, la unión de rangos y la compresión de rutas conducen a un aumento en la eficiencia de las operaciones en un bosque de conjuntos disjuntos. La unión por rango en sí da el tiempo de ejecución , donde es el número total de operaciones y es el número de elementos en el sistema. La compresión de ruta en sí misma da como resultado el tiempo de ejecución en el peor de los casos , donde es el número de operaciones FIND_SET. La aplicación de ambas heurísticas da el tiempo de ejecución del peor de los casos , donde es la función inversa de Ackermann . Esta estimación es un límite inferior del tiempo de operación con conjuntos disjuntos, por lo que el bosque de conjuntos disjuntos es la estructura óptima para conjuntos disjuntos.