Beruflich Dokumente
Kultur Dokumente
Introducci
on
Definici
on de la Estructura
Una estructura de datos de conjuntos disjuntos (disjoint-set data structure) mantiene una
coleccion
S = {S1 , S2 , . . . , Sk }
de conjuntos disjuntos entre s
i, j {1, . . . , k} | i 6= j Si Sj =
con elementos dentro de un cierto universo
U = {x1 , . . . , xn }
Cada conjunto de la coleccion se identifica por un representante que puede ser un miembro cualquiera del conjunto. Solo se requiere que al consultar por el representante de un
conjunto dos veces consecutivas sin modificar el conjunto el resultado sea el mismo.
Sin perder generalidad se puede asumir que U = {1, . . . , n}. Si no fuera as se puede encontrar una funcion biyectiva que realice la traduccion entre U y el conjunto {1, . . . , n}.
Sean x, y U se desea implementar las siguientes operaciones:
1
En lo que sigue se intentara analizar el costo de diferentes implementaciones de la estructura al ejecutar una secuencia de m de estas operaciones, de las cuales n son operaciones
MakeSet, q son operaciones Union y f son operaciones Find (Ver Tabla 1).
Como los conjuntos son disjuntos, cada operacion Union reduce el n
umero de conjuntos
en 1. Luego de n 1 operaciones Union solamente queda un conjunto, por lo tanto el
n
umero de operaciones Union es a lo sumo n 1.
N
umero de Operaciones
MakeSet
Union
Find
n
q n 1 f = m (n + q)
Tabla 1: N
umero de operaciones de cada tipo en la secuencia .
Se considerara ademas que en cada una de las operaciones Union(x, y), x e y son los
representantes de los conjuntos a los que pertencen.
Aplicaci
on
3
MakeSet ( v ) ;
4
end
5
foreach ( u , v ) E(G)
6
i f Find ( u ) 6= Find ( v ) then
7
Union ( u , v ) ;
8
end
9
end
10 end
1 procedure same
2
i f Find ( u )
3
return
4
else
5
return
6
end
7 end
component ( u , v )
= Find ( v ) then
True ;
False ;
Ejemplo
a
Paso
0
1
2
3
4
5
Arista Procesada
inicio
(a,b)
(a,e)
(a,g)
(c,d)
(c,i)
{a}
{b}
{a, b}
{a, b, e}
{a, b, e, g}
{a, b, e, g}
{a, b, e, g}
{c}
{c}
{c}
{c}
{c, d}
{c, d, i}
S
{d} {e} {g} {h} {i}
{d} {e} {g} {h} {i}
{d}
{g} {h} {i}
{d}
{h} {i}
{h} {i}
{h}
Representaci
on por Arreglos
(a)
(b)
rep
b
c
c
c
d
f
e
c
f
f
rep
b
c
c
c
d
c
e
c
f
c
g
f
g
c
h
c
h
c
Figura 2: (a) Representacion por arreglos de los conjuntos {c, h, e, b} con c como representante y {f, g, d} con f como representante. (b) Resultado luego de ejecutar Union(c, f ).
Representaci
on por Listas
Se puede mejorar el costo de la operacion Union si en lugar de recorrer todas las entradas
del arreglo rep se recorren solamente aquellas que corresponden a uno de los dos conjuntos.
Esto se puede lograr representando los conjuntos mediante listas usando arreglos.
Se representa la estructura usando un arreglo rep como en el caso anterior, un arreglo next
que indica el sucesor de un elemento en la lista a la que pertenece y un arreglo last que
almacena el u
ltimo elemento de cada lista. El primer elemento de cada lista sirve como
representante del conjunto.
Se incializan todas las posiciones del arreglo rep en 0.
La operacion Makeset(x) crea una nueva lista que contiene solo al elemento x en
O(1).
La operacion Find(x) simplemente devuelve el valor de rep[x]. O(1).
Para la operacion Union(x, y) se recorre, por ejemplo, la lista que comienza en x
cambiando las entradas correspondientes en el arreglo rep por y y luego se concatena
al final de la lista que comienza en y. (Fig. 3)
(a)
(b)
Figura 3: (a) Representacion en forma de lista de los conjuntos {c, h, e, b} y {f, g, d}. (b)
Resultado luego de ejecutar Union(c, f ).
1 procedure MakeSet ( x )
2
r ep [ x ] := x ;
3
next [ x ] := 0 ;
4
l a s t [ x ] := x ;
5 end
1 function Find ( x )
2
return r ep [ x ] ;
3 end
1 procedure Union ( x , y )
2
p := x ;
3
do
4
r ep [ p ] := y ;
5
p := next [ p ] ;
6
while p 6= 0
7
next [ l a s t [ y ] ] := x ;
8
l a s t [ y ] := l a s t [ x ] ;
9 end
Para realizar una operacion Union se recorre toda la lista x, lo que lleva un tiempo
proporcional a la longitud de la lista. Se puede construir una secuencia de m operaciones
que lleve tiempo (m2 ). Considere la secuencia de m operaciones con n = m/2 + 1 y
q = m n = m/2 1 que se muestra en la Tabla 3.
Operacion
MakeSet(x1 )
..
.
N
umero de Actualizaciones a rep
1
..
.
MakeSet(xn )
Union(x1 , x2 )
Union(x2 , x3 )
Union(x3 , x4 )
..
.
1
1
2
3
..
.
Union(xq1 , xq )
q1
i = (q 2 )
i=1
El n
umero total de actualizaciones es de orden (n + q 2 ) = (m2 ) porque n = (m) y
q = (m). En promedio cada una de las m operaciones tiene orden (m).
5.1
Uni
on por Tama
no
actualizaciones en todas las operaciones Union es por lo tanto de orden O(q log n). Cada
operacion MakeSet y cada operacion Find toma tiempo O(1), por lo tanto la secuencia
completa toma tiempo O(n + q log n + f ). En el peor caso, cuando n = (m), q = (m)
y f = (m), el orden es O(m log m).
Representaci
on por Arboles
Se puede representar la coleccion S como una coleccion de arboles donde cada arbol representa un conjunto y cada nodo es un miembro del conjunto. El representante de un
conjunto es el nodo raz en el arbol y para cada nodo solo se mantiene un puntero a su
nodo padre en un arreglo llamado f ather (Fig. 4).
c
f
e
f
c
d
g
d
e
b
(a)
(b)
Figura 4: Un bosque de conjuntos disjuntos. (a) Dos arboles representando los conjuntos
de la Fig. 3. El arbol de la izquierda representa el conjunto {b, c, e, h}, con c como
el representante, y el arbol de la derecha representa el conjunto {d, f, g} con f como
representante. (b) El resultado luego de Union(c, f ).
Se incializan todas las posiciones del arreglo f ather en -1.
La operacion Makeset(x) crea un nuevo arbol que solo contiene al elemento x en
O(1).
La operacion Find(x) recorre el arbol donde esta x hasta la raz para buscar el
representante del conjunto. El orden temporal esta dado por la altura del arbol.
La operacion Union(x, y) asigna, por ejemplo, f ather[x] := y en O(1). (Fig. 3)
1 procedure MakeSet ( x )
2
f a t h e r [ x ] := 0 ;
3 end
1 function Find ( x )
2
i f f a t h e r [ x ] = 1 then
3
return 0 ;
8
4
5
6
7
8
9 end
end ;
while f a t h e r [ x ] =
6 0 do
x := f a t h e r [ x ] ;
end
return x ;
1 procedure Union ( x , y )
2
f a t h e r [ x ] := y ;
3 end
Hasta el momento, no se obtuvo ninguna mejora sobre la representacion por listas en el
orden de tiempo que lleva ejecutar una secuencia de m operaciones. Es posible crear una
secuencia de aproximadamente m/3 operaciones MakeSet seguidas de aproximadamente
m/3 operaciones Union de tal forma que se obtenga un u
nico conjunto representado
como un arbol lineal una cadena de nodos. Se puede encontrar luego una secuencia de
aproximadamente m/3 operaciones Find cada una de las cuales lleve tiempo (m/3). La
secuencia completa se ejecutara en tiempo (m2 ).
6.1
Heursticas
Utilizando dos simples heursticas en las operaciones Union y Find se puede mejorar el
orden de tiempo para ejecutar una secuencia de m operaciones.
6.1.1
Uni
on por Tama
no
Compresi
on de Caminos
Cada vez que se ejecuta una instruccion Find(x) se recorre el camino desde x hasta la raz
del arbol que lo contiene. Se puede mejorar el tiempo que llevaran futuras operaciones si
durante la operacion se convierte cada nodo en el camino de b
usqueda en un hijo de la
raz. (Fig. 5)
6.2
Implementaci
on
(a)
(b)
f
e
f
e
d
c
b
a
(b) Arbol
luego de ejecutar Find(a) utilizando compresion de caminos.
1 procedure MakeSet ( x )
2
s i z e [ x ] := 0 ;
3 end
1 function Find ( x )
2
r := x ;
3
while f a t h e r [ r ] 6= 0 do
4
r := f a t h e r [ r ] ;
5
end
6
/ r e s ahora l a r a z d e l a r b o l /
7
8
p := x ;
9
while p 6= r do
10
t := f a t h e r [ p ] ;
11
f a t h e r [ p ] := r ;
12
p := t ;
13
end
14
return r ;
15 end
1 procedure Union ( x , y )
2
i f s i z e [ x ] > s i z e [ y ] then
3
f a t h e r [ y ] := x ;
4
s i z e [ x ] := s i z e [ x ] + s i z e [ y ] ;
10
5
else
6
f a t h e r [ x ] := y ;
7
s i z e [ y ] := s i z e [ y ] + s i z e [ x ] ;
8
end
9 end
6.3
6.4
An
alisis de Complejidad
Definici
on F y G
Definimos las funciones F y G como sigue:
1
k=0
F (k) =
2F (k1) k 1
G(n) = min{k N | F (k) n}
La funcion F crece muy rapidamente y la funcion G muy lentamente:
n 265536 = G(n) 5
11
(1)
(2)
n
0
1
2
F (n)
20 = 1
0
22 = 2
20
22 = 4
0
22
22
3
4
5
0
22
22
= 16
= 65536
0
22
22
22
= 265536
1
2
4
16
65536
265536
G(n)
0
1
2
3
4
5
N(g)
n/2r
(3)
r=F (g1)+1
=
=
(4)
(5)
(6)
(7)
El maximo costo para un vertice en el grupo g es menor o igual que F (g) F (g 1), luego
el costo maximo de todos los vertices en el grupo g, C(g) resulta
C(g) = (F (g) F (g 1)) N(g)
n
(F (g) F (g 1))
F (g)
F (g 1)
= n
F (g)
n
(8)
(9)
(10)
(11)
Por lo tanto, como no puede haber mas de G(n) grupos, el maximo costo asignado a todos
los vertices es n G(n). Como el maximo costo asignado a una operacion Find es G(n),
el maximo costo asignado a todas las operaciones Find es f G(n). Por u
ltimo, todas las
14
Referencias
[AHU74] Alfred V. Aho, J. E. Hopcroft, and Jeffrey D. Ullman. The Design and Analysis
of Computer Algorithms. Addison-Wesley, 1974.
[CSRL01] Thomas H. Cormen, Clifford Stein, Ronald L. Rivest, and Charles E. Leiserson.
Introduction to Algorithms. McGraw-Hill Higher Education, 2001.
[Sed92]
15