You are on page 1of 8

Conjuntos disjuntos (Relaciones de equivalencia)

Una relacin R se dene en un conjunto C si para todo par de elementos (a, b), a, b C, a R b es verdadera o falsa. Una relacin de equivalencia es una relacin que satisface tres propiedades: reexiva, simtrica y transitiva. Dada una relacin de equivalencia , el problema natural es decidir si a b, para cualesquiera a y b. La clase de equivalencia de un elemento a C es el subconjunto de C que contiene todos los elementos relacionados con a. Las clases de equivalencia forman una particin de C: todo elemento de C aparece en exactamente una clase de equivalencia. Para decidir si a b, slo necesitamos comprobar si a y b estn en la misma clase de equivalencia.

Representacin de conjuntos disjuntos La representacin inicial es una coleccin con n conjuntos, cada uno con un elemento (todas las relaciones son falsas excepto las reexivas). Cada conjunto tiene un elemento diferente, as / que Ci C j = 0 Mantenemos en un vector el nombre de la clase de equivalencia de cada elemento. Todos los elementos se numeran de 1 a n. As, al principio se tiene Ci = {i} para i = 1 hasta n. Hay dos operaciones vlidas. La bsqueda devuelve el nombre del conjunto (es decir, la clase de equivalencia) de un elemento dado. La unin combina dos clases de equivalencia que contienen a y b en una clase de equivalencia nueva, destruyndose las originales. tipo Elemento = entero; Conj = entero; ConjDisj = vector [1..N] de entero funcin Buscar1 (C, x) : Conj devolver C[x] fin funcin

procedimiento Unir1 (C, a, b) i := min (C[a], C[b]); j := max (C[a], C[b]); para k := 1 hasta N hacer si C[k] = j entonces C[k] := i fin para fin procedimiento

La bsqueda es una simple consulta O(1). El nombre del conjunto devuelto por bsqueda es arbitrario. Todo lo que importa es que bsqueda(x)=bsqueda(y) si y slo si x e y estn en el mismo conjunto. La unin toma O(n). No importa, en lo que concierne a correccin qu conjunto retiene su nombre. Una secuencia de n 1 uniones (la mxima, ya que entonces todo estara en un conjunto) tomara un tiempo O(n2). Si tambin hubiese O(n2) operaciones bsqueda, el rendimiento sera bueno porque el tiempo de ejecucin total sera O(1) para cada operacin unin o bsqueda en el curso del algoritmo. Si hay menos bsquedas esta cota no es aceptable.

Segundo enfoque Examinaremos una solucin al problema que hace fcil la unin, pero difcil la bsqueda. Se utiliza un rbol para representar cada conjunto, pues cada elemento en un rbol tiene la misma raz. La raz se utiliza para nombrar el conjunto. La representacin de los rboles es fcil porque la nica informacin que necesitaremos es un apuntador al padre. Cada entrada p[i] en el vector representa el padre del elemento i. Si i es una raz, entonces p[i]=i Una bsqueda sobre el elemento x se efecta devolviendo la raz del rbol que contiene x. Para ejecutar una unin de dos conjuntos se combinan ambos rboles haciendo que la raz de un rbol apunte a la raz del otro. funcin Buscar2 (C, x) : Conj r := x; mientras C[r] <> r hacer r := C[r] fin mientras; devolver r fin funcin

procedimiento Unir2 (C, raz1, raz2) { supone que raz1 y raz2 son races } si raz1 < raz2 entonces C[raz2] := raz1 sino C[raz1] := raz2 fin procedimiento

La unin toma O(1). Y la bsqueda de un elemento x es proporcional a la profundidad del nodo que representa a x; en el peor caso es O(n) Una secuencia de m bsquedas y n 1 uniones, toma O(m n) en el peor caso.

Unin por altura

Las uniones anteriores se efectuaban de un modo ms bien arbitrario. Una mejora sencilla es realizar uniones haciendo del rbol menos profundo un subrbol del rbol ms profundo. La altura de un rbol se incrementa slo cuando se unen dos rboles de igual profundidad. procedimiento Unir3 (C, A, raz1, raz2) { supone que raz1 y raz2 son races } si A[raz1] = A[raz2] entonces A[raz1] := A[raz1] + 1; C[raz2] := raz1 sino si A[raz1] > A[raz2] entonces C[raz2] := raz1 sino C[raz1] := raz2 fin procedimiento Se demuestra que si las uniones se hacen por altura, la profundidad de cualquier nodo nunca es mayor que log n. Un nodo est inicialmente a la profundidad 0. Cuando su profundidad se incrementa como resultado de una unin, se coloca en un rbol que es al menos el doble de grande que antes. As, su profundidad se puede incrementar a lo ms, log n veces Eso implica que el tiempo de ejecucin de una operacin bsqueda es O(log n) y una secuencia de m bsquedas y n 1 uniones tarda O(m log n + n)

Compresin de caminos

La compresin de caminos se ejecuta durante una operacin bsqueda y es independiente de la estrategia con que se efecten las uniones. En la bsqueda de un elemento x, todo nodo en el camino de x a la raz cambia su padre por la raz. As, los accesos futuros sobre esos nodos compensarn el trabajo adicional de hacer la compresin de caminos. funcin Buscar3 (C, x) : Conj r := x; mientras C[r] <> r hacer r := C[r] fin mientras; i := x; mientras i <> r hacer j := C[i]; C[i]:= r; i := j fin mientras; devolver r fin funcin

La compresin de caminos no es del todo compatible con la unin por altura, porque se pueden cambiar las alturas de los rboles.

Las alturas almacenadas para cada rbol se convierten en alturas estimadas (llamadas rangos), pero ocurre que la unin por rango es tan eciente en teora como la unin por altura.

You might also like