Está en la página 1de 12

142

Cap tulo 4. Representacin de conjuntos mediante arboles o

Es ms, en la aplicacin del corrector ortogrco interactivo los tries resultan espea o a cialmente interesantes. A medida que el usuario escribe, el programa ir movindose por a e el rbol, de manera que cada pulsacin de una tecla corresponder a bajar un nivel en el a o a rbol. Al acabar una palabra, se comprobar si existe un valor para la etiqueta $. Todas a a las operaciones tardar un tiempo constante y muy reducido. El corrector podr incluir an a otras utilidades, como por ejemplo completar una palabra a medio escribir si a partir de ese prejo slo existe una palabra correcta. o

4.2.

Relaciones de equivalencia

Las relaciones de equivalencia son un concepto matemtico denido sobre un cona junto dado cualquiera. Como tantos otros conceptos matemticos, est basado en una idea a a intuitiva, la representacin de relaciones del tipo: ciudades en una misma regin, alumnos o o de la misma clase, instrucciones dentro del mismo bloque de cdigo, enteros con el mismo o valor de mdulo P , etc. o Denicin 4.2 Una relacin de equivalencia sobre un conjunto C es una relacin R o o o que cumple las siguientes propiedades7 : Reexiva. a C; a R a Simtrica. a, b C; a R b b R a e Transitiva. a, b, c C; (a R b) (b R c) (a R c) Es fcil comprobar estas propiedades para los ejemplos anteriores. Por ejemplo, a la propiedad reexiva signica que una ciudad est en la misma regin que ella misma, a o obviamente!; la simtrica dir que si la ciudad a est en la misma regin que b, entonces b e a a o est en la misma regin que a; y la transitiva, que si a est en misma regin que b, y esta en a o a o la misma que c, entonces a y c estn en la misma regin. Las tres se cumplen de manera a o trivial. En la gura 4.7 se muestra un ejemplo particular de relacin de equivalencia, o denida sobre un conjunto de nueve elementos. Las relaciones de equivalencia dan lugar al concepto de clase de equivalencia. La clase de equivalencia de un elemento a, segn una relacin R sobre un conjunto C, u o es el subconjunto de todos los elementos c de C tales que c R a. Por ejemplo, en los casos anteriores tendr amos: la clase de las ciudades de la Regin de Murcia, la clase o de los alumnos de segundo curso, etc. El conjunto de todas las clases de equivalencia denidas sobre C segn la relacin R, forma una particin de ese conjunto, es decir, son u o o un conjunto de subconjuntos disjuntos y la unin de todos ellos es el conjunto de partida o C. Nuestro inters, como programadores, es estudiar la implementacin eciente de e o relaciones de equivalencia denidas sobre conjuntos nitos. Adems, vamos a considerar a especialmente relaciones que no pueden ser calculadas mediante una frmula (como ocurre, o por ejemplo, con la igualdad de enteros mdulo P ) y que pueden variar en tiempo de o ejecucin. En otro caso, la implementacin ser inmediata. Pero, en primer lugar, vamos o o a a denir un tipo abstracto de datos para el uso de relaciones de equivalencia.
7

La expresin a R b se lee a est relacionado con b. o a

4.2. Relaciones de equivalencia

143

C
1 3 4 5 2 6 8 7 9

Figura 4.7: Ejemplo de relacin de equivalencia y clases de equivalencia, denidos sobre el o conjunto de los enteros del 1 a 9. Los elementos que estn en la misma clase de equivalencia a aparecen dibujados dentro del mismo subconjunto del conjunto C. El TAD relacin de equivalencia o La denicin del tipo abstracto debe enumerar las operaciones que se pueden aplicar o sobre relaciones de equivalencia y su signicado. Existen varias maneras de plantear la utilizacin del tipo. Una primera forma ser empezar con una relacin m o a o nima, vac a, al crearla y tener una operacin para unir varias clases de equivalencia en una. Otra o posibilidad ser empezar una sola clase de equivalencia al crear e incluir operaciones para a partir una clase en dos o ms. A lo largo de toda esta seccin, trabajaremos exclusivamente a o con la primera posibilidad. Adems de los constructores del tipo que, en este caso, ser la operacin Crear a an o para formar una nueva relacin vac y Union para juntar dos clases aadimos una opeo a n racin Encuentra para consultar la clase de equivalencia de un elemento de C cualquiera. o La especicacin informal del tipo abstracto es la siguiente. o TAD RelacionEquiv[T: tipo] es Crear, Union, Encuentra Requiere El tipo T debe tener denida una operacin de comparacin Igual (ent T, T; sal boolean). o o Descripcin o Los valores de tipo RelacionEquiv[T] son relaciones de equivalencia modicables, denidas sobre conjuntos de elementos del tipo T. En particular, el conjunto de elementos que pueden participar en la relacin de equivalencia es indicado en la operacin Crear. Para o o aadir relaciones entre elementos se debe utilizar la operacin Union, y para consulta la n o clase de un elemento se debe usar Encuentra. Operaciones Operacin Crear (ent C : Conjunto[T]; sal RelacionEquiv[T]) o Requiere: El conjunto C debe ser no vac o. Calcula: Devuelve una relacin de equivalencia m o nima sobre el conjunto C, donde las clases de equivalencia son los elementos en s mismos, es decir, para todo a y b de C, a est relacionado con b s y slo si a=b. a o Operacin Union (ent R: RelacionEquiv[T]; a, b: T) o Requiere: Los elementos a y b deben pertenecer al conjunto C sobre el que se ha denido la relacin de equivalencia R. o

144

Cap tulo 4. Representacin de conjuntos mediante arboles o

Modica: R Calcula: En la nueva relacin de equivalencia R, los elementos a y b pertenecen o a la misma clase de equivalencia. Adems, se mantienen las dems relaciones a a denidas previamente sobre R. Operacin Encuentra (ent R: RelacionEquiv[T]; a: T; sal T) o Requiere: El elemento a deben pertenecer al conjunto C sobre el que se ha denido la relacin de equivalencia R. o Calcula: Devuelve el nombre de la clase de equivalencia a la que pertenece el elemento a dentro de la relacin R. Este nombre es un elemento representativo o dentro de dicha clase. Fin RelacionEquiv. Para saber si dos elementos x e y estn en la misma clase, simplemente comprobamos a si Encuentra(x) = Encuentra(y ). Como se documenta en la especicacin de Encuentra, el o resultado es un elemento de los que pertenecen a la clase de x. Este elemento puede ser seleccionado arbitrariamente entre los de dicha clase. Solamente necesitamos que al aplicar Encuentra para dos elementos relacionados, devuelva siempre el mismo valor. Por ejemplo, en la relacin de la gura 4.7, a la clase formada por {1, 3, 4} se le o puede asociar como nombre representativo cualquiera de esos tres valores; pero una vez asociado uno, no puede variar. En denitiva, lo importante no es el valor concreto, sino que Encuentra(1) = Encuentra(3) = Encuentra(4). Obviamente, el nombre s que puede cambiar despus de una operacin Union. e o Ejemplo de uso de relaciones de equivalencia Un ejemplo de utilizacin intensiva de las relaciones de equivalencia lo podemos o encontrar en el procesamiento de imgenes digitales. Supongamos una imagen en escala a de grises, como la de la gura 4.8, que est compuesta por una matriz de p a xeles. En este caso, las clases de equivalencia son las regiones contiguas y del mismo color. Estas clases surgen de la siguiente relacin de equivalencia: dos p o xeles a y b estn relacionados a si tienen el mismo color (o nivel de gris) y adems son adyacentes en la imagen8 . a En esta aplicacin, el clculo y la modicacin de las clases de equivalencia puede o a o resultar interesante para diversos propsitos. Por ejemplo, si queremos aplicar la operacin o o rellenar una regin de color, tendremos que buscar la clase de equivalencia del punto o sobre el que se aplica el rellenado. Tras aplicar la operacin, pueden ocurrir cambios en o las clases de equivalencia, que se debern tener en cuenta posteriormente. a Tambin podr resultar interesantes operaciones para contar el nmero de regiones e an u existentes en la imagen, o saber cul contiene ms p a a xeles. Por ejemplo, un posible algoritmo de deteccin de caras humanas en una imagen podr estar basado en buscar o a una regin contigua de color de piel, y que contenga por lo menos dos regiones oscuras o correspondientes a los ojos. En todas estas aplicaciones, la relacin est denida sobre un conjunto nito, y o a puede variar dinmicamente a lo largo del tiempo. Si consideremos imgenes con una a a resolucin de 800600 p o xeles, entonces el conjunto C sobre el que est denida la relacin a o tendr 480.000 elementos. Por lo tanto, conseguir una implementacin muy eciente para a o
8

Es decir, uno se encuentra inmediatamente encima, debajo, a la izquierda o a la derecha del otro.

4.2. Relaciones de equivalencia

145

Regin 1
40

Regin 2

30

Regin 3
20

Regin 4 Regin 2

Regin 5
10

Regin 2 Regin 6
0 10 20 30 40 50

Regin 7
0

Figura 4.8: Ejemplo de aplicacin de relaciones y clases de equivalencia, en procesamiento o de imgenes. Aparecen sealadas algunas clases (regiones) cuyos p a n xeles tienen color negro. conocer y manejar las clases de equivalencia resulta fundamental en este caso.

4.2.1.

Representaciones sencillas de relaciones de equivalencia

La representacin de relaciones de equivalencia es un ejemplo t o pico de problema donde se intuye fcilmente una solucin simple y directa. Pero un pequeo e irritante a o n contratiempo hace que esta solucin se comporte peor de lo que se esperaba, lo cual o obliga a tomar un largo rodeo para alcanzar una representacin eciente. o Representacin mediante arrays o Supongamos, para simplicar el problema, que las relaciones de equivalencia estn a denidas sobre un tipo enumerado. Es ms, supongamos que los elementos del conjunto a C sobre el que se denen estn numerados desde 1 hasta cierto l a mite N . Por ejemplo, en el caso de las imgenes, podemos asignar un nmero consecutivo a cada p a u xel, de arriba abajo y de izquierda a derecha. Para imgenes de resolucin 800 600, N = 480.000. a o La representacin ms sencilla podr consistir en un array de tamao N , donde en o a a n cada posicin se almacena el nombre de la clase de equivalencia del elemento correspono diente. La denicin del tipo ser la siguiente. o a tipo RelacionEquiv[N] = array [1..N] de entero En la gura 4.9a) se muestra un ejemplo de la disposicin en memoria de la estruco tura, para la relacin de equivalencia denida en la gura 4.7. o La implementacin de las operaciones Crear y Encuentra es inmediata. o operacin Crear (var R: RelacionEquiv[N]) o

146

Cap tulo 4. Representacin de conjuntos mediante arboles o

(a)
1

R
2

1
3

2
4

1
5

5
6

2
7

8
8

8
9

R
1 2 6

ultimo primero

8 9

(b)

3 4

Figura 4.9: Ejemplo de representaciones sencillas de relaciones de equivalencia, para la relacin de la gura 4.7. a) Representacin con arrays. b) Representacin con listas. o o o para i:= 1, ..., N hacer R[i]:= i npara operacin Encuentra (R: RelacionEquiv[N]; a: entero): entero o devolver R[a] La operacin Encuentra est claramente en un O(1), lo cual resulta muy interesante. o a Por otro lado, Crear tarda un O(N ), lo cual no es muy preocupante puesto que slo se o aplicar una vez. El problema es, sin embargo, la operacin Union que es previsible que a o aparezca con ms frecuencia. Cmo hacer la unin de dos clases? Simplemente cambiando a o o en el array el nombre de una de las clases por la otra. Supongamos que los parmetros que recibe la operacin son nombres de clases (y a o no valores de elementos particulares). La implementacin podr ser la siguiente. o a operacin Union (var R: RelacionEquiv[N]; a, b: entero) o para i:= 1, ..., N hacer si R[i] = b entonces R[i]:= a nsi npara Es fcil ver que la operacin Union tarda un O(N ), en todos los casos. Este coste a o puede resultar excesivo para muchas aplicaciones. En el ejemplo del procesamiento de imgenes, se aplicar la unin siempre que un p tenga a un lado algn otro p del a a o xel u xel mismo color lo cual suele ser muy frecuente. Si tenemos que aplicar Union para cada p de una imagen de 800 600, el nmero total de comparaciones dentro del bucle para xel u 2 ser (800 600) = 230 mil millones de comparaciones! a: Representacin mediante listas o Para solucionar el problema anterior podemos intentar una representacin dinmica o a mediante listas, al estilo de las representaciones bsicas de conjuntos estudiadas en el a

4.2. Relaciones de equivalencia

147

cap tulo anterior. Para cada clase de equivalencia usamos una lista de elementos, en la que estarn los elementos que pertenecen a la misma. La denicin del tipo ser a o a. tipo RelacionEquiv[N] = array [1..N] de Lista[entero] Siendo sucientemente cuidadosos, deber amos usar una estructura que permita concatenar dos listas de forma rpida. Esto se puede conseguir, por ejemplo, usando listas a circulares y doblemente enlazadas; o simplemente almacenando en la cabecera de las listas un puntero al primer y al ultimo elemento, como se muestra en la gura 4.9b). Usando la segunda opcin, la operacin Union se puede conseguir en un tiempo o o constante, O(1), de la siguiente forma. Se supone que el tipo Lista incluye los atributos primero y ultimo, y los nodos de lista tienen siguiente, para enlazar los elementos. operacin Union (var R: RelacionEquiv[N]; a, b: entero) o R[a].ultimo.siguiente:= R[b].primero R[a].ultimo:= R[b].ultimo R[b]:= NULO El problema surge ahora con la operacin Encuentra. Cmo podemos saber la clase o o a la que pertenece un elemento concreto? Deber amos recorrer todas las listas hasta encontrarlo en alguna de ellas. operacin Encuentra (R: RelacionEquiv[N]; a: entero): entero o para i:= 1, ..., N hacer si BuscaLista (R[i], a) entonces devolver i nsi npara error(El elemento, a, no est en ninguna clase) a Damos por supuesta la operacin BuscaLista, que realiza un simple recorrido secueno cial en una lista. No siempre tardar el mismo tiempo, pero sabemos que en el peor caso a se recorrern en total todos los elementos de todas las listas, es decir N . En promedio, la a operacin Encuentra recorrer la mitad de las listas, tardando un O(N ). o a Si resulta malo que la operacin Union est en un O(N ), como ocurr usando arrays, o e a el hecho de que Encuentra tarde un O(N ) puede ser aun ms desastroso en aplicaciones a que requieren un uso intensivo de las relaciones de equivalencia.

4.2.2.

Representacin mediante punteros al padre o

El inconveniente ultimo de las dos anteriores representaciones es que utilizan estruc turas lineales ya sean enlazadas (listas) o contiguas en memoria (arrays) lo cual ocasiona tiempos lineales, bien para la bsqueda o para la unin de clases de equivalencia. En su u o lugar vamos a estudiar el uso de estructuras arbreas. Vamos a disponer de un arbol para o cada clase, donde la ra del rbol ser por denicin el nombre de esa clase. z a a o Bsicamente, la unin de dos arboles se puede conseguir en un tiempo constante, a o colocando un arbol como subrbol del otro. En cuanto a la bsqueda, est claro que a u a necesitamos una operacin que dado un elemento del arbol encuentre cul es la ra Por o a z. esta razn, usamos una representacin de rboles con punteros al nodo padre. o o a

148

Cap tulo 4. Representacin de conjuntos mediante arboles o

Arboles de punteros al padre La clave de la representacin de rboles con punteros al padre es que para cada nodo o a del rbol slo necesitamos conocer un valor: un puntero o referencia a su padre dentro del a o rbol. Para la ra del rbol ese valor ser nulo o algn otro valor especial. a z a a u Suponiendo que el nmero de elementos del rbol es jo, o limitado por un tamao u a n reducido, la estructura de punteros al padre se puede almacenar en simple array. tipo ArbolEnteros[N] = array [1..N] de entero Si R es un rbol de enteros que usa esta estructura, entonces la posicin R[i] indica a o el padre del nodo i. Un ejemplo de representacin de rboles con esta denicin se puede o a o ver en la gura 4.10. En este caso, se usa el valor 0 para indicar que el nodo es la raz de un rbol. a
R: array [1..10] de entero
1 2 3 4 5 6 7 8 9 10

6 8 7 2 5 3 1 4 9

8 10

Figura 4.10: Ejemplo de representacin de rboles mediante punteros al padre. o a

Bosques de relaciones de equivalencia La anterior representacin de rboles con punteros al padre se ajusta perfectamente o a a nuestras necesidades: el nmero de elementos de la relacin de equivalencia es jo, se u o dene al crear la relacin. Realmente, la estructura no almacena un solo arbol sino un o conjunto de arboles, lo que normalmente se conoce como un bosque. La denicin del o 9 tipo ser la siguiente . a tipo RelacionEquiv[N] = array [1..N] de entero Como ya hemos avanzado, cada arbol del bosque representa una clase de equiva lencia, en la cual la ra es el nombre de esa clase. La implementacin de las operaciones z o es sencilla. La operacin Crear crea una relacin de equivalencia m o o nima, donde cada elemento slo est relacionado consigo mismo. Equivalentemente, cada elemento del conjunto o a ser la ra de un rbol. Usando el valor 0 para representar las ra a z a ces, tenemos. operacin Crear (var R: RelacionEquiv[N]) o para i:= 1, ..., N hacer R[i]:= 0
El lector podr apreciar un curioso hecho, la denicin es exactamente la misma que en la reprea o sentacin mediante arrays! La diferencia es la forma en la que se maneja el array. Mientras que antes lo o usbamos para almacenar las clases de cada elemento, ahora lo usamos para representar arboles. Esto a demuestra, una vez ms, la estrecha relacin existente entre algoritmos y estructuras de datos. La estruca o tura de datos no determina un vocamente un tipo de datos, sino que se deben tener en cuenta tambin e los algoritmos que manipulan esa estructura.
9

4.2. Relaciones de equivalencia

149

npara Aunque su tiempo es claramente un O(N ), ya hemos visto que en este caso no supone un inconveniente, ya que slo se har al principio. Por otro lado, la operacin o a o Union simplemente coloca un arbol como subrbol del otro. Igual que antes, suponemos a que los parmetros no son elementos sino nombres de clases de equivalencia10 . a operacin Union (var R: RelacionEquiv[N]; a, b: entero) o R[a]:= b // a se coloca como hijo de b As pues, la operacin tarda un interesante O(1). Finalmente, la operacin Encuentra o o debe subir por el rbol, hacia sus antecesores, hasta llegar a la ra de su rbol. Una posible a z a implementacin recursiva ser la siguiente. o a operacin Encuentra (R: RelacionEquiv[N]; a: entero): entero o si R[a] = 0 entonces devolver a sino devolver Encuentra(R[a]) nsi El tiempo de la operacin Encuentra depende de la profundidad del nodo buscado o dentro del rbol. En principio, es de esperar que un arbol de N nodos tenga una profundia dad de un orden logar tmico en funcin de N , con lo cual el tiempo estar en un O(log n). o a Sin embargo, en el peor caso el arbol puede adoptar una forma lineal: cualquier nodo slo o tiene un descendiente como mximo. En tal caso, un arbol de N nodos tendr profundidad a a N y las operaciones de bsqueda estarn en promedio en O(N ). Vamos a ver un ejemplo u a ilustrativo de una situacin de este tipo. o Ejemplo 4.1 Utilizando la representacin de relaciones de equivalencia con punteros al o padre, denimos una variable R de tipo RelacionEquiv[9], para almacenar relaciones en el conjunto de los naturales de 1 a 9. Sobre esta estructura aplicamos las siguientes operaciones: Crear(R), Union(R, 3, 4), Union(R, 9, 8), Union(R, 4, 1), Union(R, 5, 6), Union(R, 1, 6) y Encuentra(R, 3). El resultado se muestra en la gura 4.11.

4.2.3.

Equilibrado y compresin de caminos o

Podemos extraer una conclusin prctica del anterior ejemplo: si queremos conseguir o a eciencia en una representacin de rboles debemos garantizar que el arbol crecer a lo o a a ancho, ms que a lo largo. Un arbol poco profundo signica pocos pasos en la bsqueda, a u lo cual se traduce en operaciones ms rpidas. Entonces, cmo podemos hacer que el a a o rbol crezca a lo ancho? a Supongamos, en primer lugar, que tenemos un arbol a de profundidad 40 y otro rbol b de profundidad 2. Tenemos dos opciones en principio igual de vlidas, colocar a a a como hijo de b o viceversa. Si hacemos que a sea hijo de b, entonces el nuevo arbol tendr profundidad 41. En cambio, si colocamos b como hijo de a, la profundidad del a rbol no var seguir siendo 40. El resultado es bastante claro: si queremos que el a a, a rbol no crezca en profundidad, debemos colocar el arbol menos profundo como subrbol a a
10

En caso contrario, habr que aplicar las operaciones de bsqueda correspondientes. a u

150

Cap tulo 4. Representacin de conjuntos mediante arboles o

Crear(R)
1 2 3 4 5 6 7 8 9

R 0 0 0 0 0 0 0 0 0

Union(R, 3, 4)
1 2 3 4 5 6 7 8 9

R 0 0 4 0 0 0 0 0 0

2 3

Union(R, 9, 8)
1 2 3 4 5 6 7 8 9

R 0 0 4 0 0 0 0 0 8

2 3

8 9

Union(R, 4, 1)
1 2 3 4 5 6 7 8 9

R 0 0 4 1 0 0 0 0 8

1 4

8 9

Union(R, 5, 6)
1 2 3 4 5 6 7 8 9

R 0 0 4 1 6 0 0 0 8

1 4

2 5 3

8 9

Union (R, 1, 6)
1 2 3 4 5 6 7 8 9

R 6 0 4 1 6 0 0 0 8

2 5

6 1

8 9 4 3

Encuentra(R, 3) = Encuentra(R, 4) = Encuentra(R, 1) = Encuentra(R, 6) = 6


Figura 4.11: Evolucin de la estructura de relaciones de equivalencia, para las operaciones o del ejemplo 4.1. del ms profundo. Si ambos son igual de profundos, entonces necesariamente el arbol a resultante crecer en profundidad. a Calcular la profundidad de los arboles puede resultar de por s muy costoso, y especialmente con el tipo de representacin usado. Pero si se almacena la profundidad y o se va actualizando a medida que crece el arbol, podemos lograrlo ecientemente. Para no incurrir en un uso adicional de memoria, vamos a usar la misma denicin o del tipo que en el anterior apartado, pero cambiando la forma de manejar las operaciones.

4.2. Relaciones de equivalencia

151

En particular, si antes almacenbamos un 0 en el array para las ra a ces, ahora podemos tener 0 o un nmero negativo indicando la profundidad de ese arbol. De esta manera, u en la operacin Union podemos comprobar fcilmente cul es el rbol ms profundo. En o a a a a caso de que sean iguales, da lo mismo cul se coloque como hijo y adems sabemos que a a el rbol resultante aumentar de nivel. a a operacin Union (var R: RelacionEquiv[N]; a, b: entero) o si R[b] < R[a] entonces // El rbol b es ms profundo a a R[a]:= b sino // El rbol a es ms o igual de profundo a a si R[a] = R[b] entonces R[a]:= R[a]-1 nsi R[b]:= a nsi Por otro lado, en la operacin Encuentra es posible hacer otra modicacin intereo o sante conocida como compresin de caminos. Supongamos que sobre una relacin de o o equivalencia aplicamos la operacin Encuentra(x), obteniendo como resultado una clase y o cualquiera. La operacin habr necesitado un nmero de pasos que depende de su proo a u fundidad en el rbol. Ahora bien, puesto que despus de ejecutar la operacin sabemos a e o que la clase de x es y , es posible hacer que x apunte directamente a y , esto es R[x]:= y . De esta forma, la prxima vez que se ejecute Encuentra(x) slo se necesitar un paso para o o a llegar a la ra del rbol. z a Es ms, la idea de apuntar directamente a la ra del rbol se puede aplicar a a z a todos los antecesores del nodo x, que se recorren al aplicar la operacin de bsqueda. En o u denitiva, la operacin Encuentra con compresin del rbol ser la siguiente. o o a a operacin Encuentra (var R: RelacionEquiv[N]; a: entero): entero o si R[a] 0 entonces devolver a sino R[a]:= Encuentra(R, R[a]) devolver R[a] nsi El objetivo del proceso de compresin de caminos es reducir la profundidad de los o nodos sobre los que se aplica la bsqueda. En algn caso, esta reduccin puede dar lugar u u o a una disminucin en la profundidad total del arbol. o Sin embargo, se puede ver que la implementacin de la operacin Encuentra no o o actualiza esa profundidad, que es almacenada en las ra ces con valores negativos. Esta omisin no es casual, recalcular la profundidad del arbol supondr un coste computacional o a de O(N ) que echar a perder la eciencia de tipo sin producir una mejora sustancial a posterior. As pues, podemos decir que la profundidad almacenada en los nodos ra es ces realmente un valor de profundidad mxima o profundidad suponiendo que no se aplican a bsquedas. u Ejemplo 4.2 Vamos a analizar la ejecucin de las operaciones del ejemplo 4.1, con o las modicaciones propuestas para Union y Encuentra. Las operaciones aplicadas son :

152

Cap tulo 4. Representacin de conjuntos mediante arboles o

Crear(R), Union(R, 3, 4), Union(R, 9, 8), Union(R, 4, 1), Union(R, 5, 6), Union(R, 4, 6) y Encuentra(R, 3). El resultado se muestra en la gura 4.12.

Crear(R)
1 2 3 4 5 6 7 8 9

R 0 0 0 0 0 0 0 0 0

Union(R, 3, 4)
1 2 3 4 5 6 7 8 9

R 0 0 4 -1 0 0 0 0 0

2 3

Union(R, 9, 8)
1 2 3 4 5 6 7 8 9

R 0 0 4 -1 0 0 0 -1 8

2 3

8 9

Union(R, 4, 1)
1 2 3 4 5 6 7 8 9

R 4 0 4 -1 0 0 0 -1 8

2 3

4 1

8 9

Union(R, 5, 6)
1 2 3 4 5 6 7 8 9

R 4 0 4 -1 6 -1 0 -1 8

2 3

4 1 5

8 9

Union (R, 4, 6)
1 2 3 4 5 6 7 8 9

R 4 0 4 6 6 -2 0 -1 8

2 5

6 4 3

8 9 1

Encuentra(R, 3) = Encuentra(R, 4) = Encuentra(R, 6) = 6


1 2 3 4 5 6 7 8 9

R 4 0 6 6 6 -2 0 -1 8

2 5

6 3 4

8 9 1

Figura 4.12: Evolucin de la estructura de relaciones de equivalencia, para las operacioo nes del ejemplo 4.1, usando la representacin de punteros al padre, con equilibrado y o compresin de caminos. o Como cab esperar, la profundidad de los arboles obtenidos es menor aplicando a

4.2. Relaciones de equivalencia

153

equilibrado y compresin de camino. Esto signica un menor tiempo de ejecucin para o o las operaciones del tipo. Se puede ver que, en el ejemplo, la operacin Encuentra(R, 1, 6) ha sido sustituida o por Encuentra(R, 4, 6). Recordemos que la operacin Encuentra requiere que se aplique o sobre ra de los rboles. Mientras que el nodo 1 es ra en el ejemplo 4.1, en el ejemplo ces a z 4.2 no lo es. En su lugar, usamos la clase del nodo 1, es decir 4. Evaluacin de la eciencia o Es evidente que la estructura utilizada para representar relaciones de equivalencia necesita una cantidad de memoria proporcional al tamao N del conjunto sobre el que se n aplica la relacin. En el caso de las imgenes, por ejemplo, la memoria podr ser tanta o a a como la utilizada por la imagen en s No obstante, este uso es razonable teniendo en . cuenta que la relacin no puede ser calculada mediante una frmula. o o En lo que se reere al tiempo de ejecucin, tenemos por un lado la operacin Union o o que ejecuta siempre como mximo un nmero jo de instrucciones, con lo que su tiempo a u es un O(1). Por otro lado, el tiempo de la operacin Encuentra es proporcional al nivel del o nodo buscado en el rbol, como ya hemos visto. El tiempo necesario depender del caso. a a Mejor caso. Si se aplican las operaciones Union de forma adecuada, el arbol no crece en profundidad ms que una cantidad ja y reducida. En esta situacin el tiempo a o de Encuentra ser un O(1). a Peor caso. El peor caso se dar cuando el arbol crezca en profundidad lo ms a a rpidamente posible. Teniendo en cuenta la estructura del procedimiento Union, el rbol a a slo crecer de nivel cuando los dos arboles unidos tengan la misma altura. Se puede o a a nimo 2h nodos. demostrar por induccin11 que un rbol de profundidad h tiene como m o o Por lo tanto, para N nodos la profundidad mxima ser log2 N , y el tiempo de ejecucin a a de Encuentra en el peor caso es un O(log N ). Caso promedio. El tiempo promedio de Encuentra, incluyendo equilibrado y compresin de caminos, resulta dif de calcular. Se puede ver intuitivamente que el tiempo o cil ser mucho menor que un tiempo logar a tmico. En trmino medio, ser muy dif que e a cil el rbol alcance profundidad 4. Teniendo en cuenta que el arbol de profundidad 5 se a forma uniendo dos arboles de profundidad 4, ser mucho ms dif obtener el rbol de a a cil a profundidad 5, y as sucesivamente. En concreto, el tiempo de ejecucin de Encuentra en el caso promedio es un O((N )); o donde (N ) es una funcin de crecimiento muy lento, situado entre un O(1) y un O(log n). o La funcin (N ) se dene como la pseudo-inversa de una funcin A(x) de crecimiento o o muy rpido, conocida como funcin de Ackerman. Por ejemplo, los valores iniciales a o de esta funcin son: A(1) = 2, A(2) = 22 , A(3) = 22 , A(4) = 22 donde los puntos o signican repetir la operacin de elevacin 65.536 veces. A(5) es un valor tan grande que o o no existe una notacin estndar para expresarlo de forma expandida. A efectos prcticos, o a a el tiempo promedio de Encuentra se puede considerar casi un O(1).
Base de la induccin: un arbol con altura 1 tiene como m o nimo 2 nodos. Paso de induccin: suponiendo o a nimo que los rboles de altura h 1 tienen como m a nimo 2h1 nodos, un arbol de altura h tendr como m o a 2h nodos. La demostracin se deja como ejercicio. Tener en cuenta que un rbol de altura h se forma uniendo dos arboles de altura h 1.
11
2 2 ..

También podría gustarte