Download 4.5 Árboles AVL (Adelson-Velskii y Landis) Inserción y extracción en
Document related concepts
Transcript
Tema 1. Técnicas de Implementación 4. Árboles 4.5 Árboles AVL (Adelson-Velskii y Landis) Árbol binario de búsqueda que verifica que • las alturas de los subárboles derecho e izquierdo de cada nodo sólo pueden diferir, a lo sumo, en 1 • lo que garantiza que la altura sea siempre O(log n) 4 altura del subárbol con raíz en el nodo 12 8 16 1 2 4 10 1 4 2 3 16 1 3 1 14 4 1 14 1 2 Árbol AVL 1 10 2 6 estos nodos no verifican la condición AVL 2 8 1 2 5 12 6 1 Árbol no AVL M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 86 Tema 1. Técnicas de Implementación 4. Árboles Inserción y extracción en árboles AVL Se realizan igual que lo explicado para los árboles binarios de búsqueda “normales” (sección 4.4) Pero una vez finalizada la inserción o extracción puede ser necesario restablecer el equilibrio • ya que uno o más de los nodos en el camino entre la raíz y el insertado o extraído podría dejar de verificar la condición AVL 4 4 12 12 2 3 8 10 1 2 16 16 inserta(13) 1 2 4 3 3 8 16 4 Estructuras de Datos 2 2 10 1 1 6 1 2 1 14 ya no verifica la condición AVL 14 1 1 6 13 14 M. Aldea, M. González, P. Sánchez 7/11/11 87 Tema 1. Técnicas de Implementación 4. Árboles Inserción y extracción en árboles AVL (cont.) Tras una modificación se recorre el árbol desde el punto de inserción o extracción hacia la raíz Sea X el nodo más profundo que incumple la propiedad AVL • este nodo tiene a lo sumo dos X X hijos HI HD HI • la diferencia entre las profundidades de los dos subárboles es 2 HD caso 4 caso 1 Se dan 4 casos posibles X HI X HD caso 2 Estructuras de Datos M. Aldea, M. González, P. Sánchez 7/11/11 HI HD caso 3 88 Tema 1. Técnicas de Implementación 4. Árboles Operaciones de rotación: rotación simple izquierda de X Se trata de ajustar la profundidad de dos ramas para hacer el árbol más equilibrado, manteniendo la relación de orden X HI HI X C B B A C A (Se aplica al caso 1) M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 89 Tema 1. Técnicas de Implementación 4. Árboles Pseudocódigo: rotación simple izquierda de X método rotacionSimpleIzquierda (Nodo x) retorna Nodo Nodo hi:=x.hijoIzquierdo; x.hijoIzquierdo:=hi.hijoDerecho; x.hijoIzquierdo.padre=x; hi.hijoDerecho:=x; x.padre=hi; retorna hi; fmétodo Luego es preciso reinsertar la rama retornada en el lugar donde estaba en el árbol M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 90 Tema 1. Técnicas de Implementación 4. Árboles Operaciones de rotación: rotación simple derecha de X Es como la anterior, pero elevando la rama derecha X HD HD X A B A C Estructuras de Datos B C (Se aplica al caso 4) M. Aldea, M. González, P. Sánchez 7/11/11 91 Tema 1. Técnicas de Implementación 4. Árboles Pseudocódigo: rotación simple derecha de X método rotacionSimpleDerecha (Nodo x) retorna Nodo Nodo hd:=x.hijoDerecho; x.hijoDerecho:=hd.hijoIzquierdo; x.hijoDerecho.padre=x; hd.hijoIzquierdo:=x; x.padre=hd; retorna hd; fmétodo Luego es preciso reinsertar la rama retornada en el lugar donde estaba en el árbol M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 92 Tema 1. Técnicas de Implementación 4. Árboles Operaciones de rotación: rotación doble derecha-izquierda de X Cuando la parte desequilibrada es una rama central, es preciso realizar dos rotaciones: entre H1 y H2 y entre X y H2 X H2 X H2 H1 H1 X H1 C H2 D A A D B C A C B D (Se aplica al caso 2) B No importa si el desequilibrio lo provoca B o C Estructuras de Datos M. Aldea, M. González, P. Sánchez 7/11/11 Tema 1. Técnicas de Implementación 93 4. Árboles Pseudocódigo: rotación doble derecha-izquierda método rotacionDobleDI (Nodo x) retorna Nodo x.hijoIzquierdo= rotacionSimpleDerecha(x.hijoIzquierdo); x.hijoIzquierdo.padre=x; retorna rotacionSimpleIzquierda(x); fmétodo Luego es preciso reinsertar la rama retornada en el lugar donde estaba en el árbol Estructuras de Datos M. Aldea, M. González, P. Sánchez 7/11/11 94 Tema 1. Técnicas de Implementación 4. Árboles Operaciones de rotación: rotación doble izquierda-derecha de X Cuando la parte desequilibrada es una rama central, es preciso realizar dos rotaciones: entre H1 y H2 y entre X y H2 X H2 H1 X H1 H2 A C A D C D B (Se aplica al caso 3) B No importa si el desequilibrio lo provoca B o C M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 95 Tema 1. Técnicas de Implementación 4. Árboles Pseudocódigo: rotación doble izquierda-derecha método rotacionDobleID (Nodo x) retorna Nodo x.hijoDerecho= rotacionSimpleIzquierda(x.hijoDerecho); x.hijoderecho.padre=x; retorna rotacionSimpleDerecha(x); fmétodo Luego es preciso reinsertar la rama retornada en el lugar donde estaba en el árbol M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 96 Tema 1. Técnicas de Implementación 4. Árboles Árboles AVL: implementación Se implementan como cualquier otro árbol binario • punteros a padre e hijos (o sólo a los hijos) • añadiendo, además, a cada nodo un campo que indica su altura 3 12 8 12 16 2 2 4 1 4 1 3 Estructuras de Datos M. Aldea, M. González, P. Sánchez 7/11/11 97 Tema 1. Técnicas de Implementación 4. Árboles Árboles AVL: eficiencia de las operaciones Comparación de la eficiencia de las operaciones de los árboles AVL con las de un árbol binario de búsqueda no equilibrado: Operación AVL Árbol no equilibrado (caso peor y promedio) (caso promedio) Árbol no equilibrado (caso peor: altura=n) inserta O(log n) O(log n) O(n) busca O(log n) O(log n) O(n) elimina O(log n) O(log n) O(n) • Donde n es el número de nodos • La altura de un árbol AVL es siempre O(log n) • En el peor caso (para entradas ordenadas) la altura de un árbol no equilibrado puede ser O(n) M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 98 Tema 1. Técnicas de Implementación 4. Árboles 4.6 Árboles Rojinegros Un árbol rojinegro es un árbol binario de búsqueda que verifica las siguientes propiedades • Cada nodo está coloreado de rojo o negro • La raíz es negra • Si un nodo es rojo, sus hijos deben ser negros • Todos los caminos desde un nodo cualquiera a una referencia nula deben tener el mismo número de nodos negros Evita el doble recorrido del árbol AVL Estudiaremos ahora las operaciones de inserción y eliminación M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 99 Tema 1. Técnicas de Implementación 4. Árboles Ejemplo de árbol rojinegro 30 15 10 70 20 60 5 50 40 Estructuras de Datos 85 65 80 90 55 M. Aldea, M. González, P. Sánchez 7/11/11 100 Tema 1. Técnicas de Implementación 4. Árboles Inserción en un árbol rojinegro Insertamos un nuevo elemento como una hoja Para saber dónde insertar hacemos un recorrido descendente como en la inserción no equilibrada Durante este recorrido, si encontramos un nodo X con dos hijos rojos • convertimos X en rojo y sus dos hijos en negro - el número de nodos negros en un camino no varía - pero tendremos dos nodos rojos consecutivos, si el padre de X es rojo • si el padre de X es rojo, hacemos una rotación simple o doble del padre de X, cambiando los colores de forma apropiada • Este proceso se repite hasta alcanzar una hoja M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 101 Tema 1. Técnicas de Implementación 4. Árboles Inserción en un árbol rojinegro (cont.) Pondremos el nuevo nodo rojo • si le ponemos negro, incumplimos la última regla Por el procedimiento anterior el padre es negro y no hay que hacer nada más • p.e., insertar el número 45 en el árbol de la figura anterior M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 102 Tema 1. Técnicas de Implementación 4. Árboles Ejemplo de inserción en un árbol rojinegro (paso 1) En el recorrido encontramos el nodo 50 con dos hijos rojos, que cambiamos a negros, cambiando luego el 50 a rojo 30 15 10 70 20 60 5 Estructuras de Datos 65 50 40 85 80 90 55 M. Aldea, M. González, P. Sánchez 7/11/11 103 Tema 1. Técnicas de Implementación 4. Árboles Ejemplo de inserción en un árbol rojinegro (paso 2) Hacemos una rotación simple de 60 y 70, y reajustamos los colores para recuperar las propiedades 30 15 10 60 20 70 50 5 40 85 65 55 80 90 M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 104 Tema 1. Técnicas de Implementación 4. Árboles Ejemplo de inserción en un árbol rojinegro (paso 3) No es preciso hacer más cambios de color ni rotaciones, por lo que finalizamos insertando el nodo 45, de color rojo 30 15 10 5 60 20 70 50 40 55 45 Estructuras de Datos 85 65 80 M. Aldea, M. González, P. Sánchez 7/11/11 Tema 1. Técnicas de Implementación 90 105 4. Árboles Eliminación en árboles rojinegros Al igual que en el algoritmo de eliminación en árboles no equilibrados • sólo borramos nodos que son hojas o sólo tienen un hijo • si tiene dos hijos, se reemplaza su contenido, y se borra otro nodo que es una hoja o sólo tiene un hijo Si el nodo que vamos a borrar es rojo no hay problema Si el nodo a borrar es negro, la eliminación hará que se incumpla la 4ª propiedad • la solución es transformar el árbol para asegurarnos de que siempre borramos un nodo rojo Estructuras de Datos M. Aldea, M. González, P. Sánchez 7/11/11 106 Tema 1. Técnicas de Implementación 4. Árboles Eliminación en árboles rojinegros (cont.) Haremos un recorrido descendente del árbol, comenzando por la raíz; llamaremos • X al nodo actual • T a su hermano • P a su padre Intentaremos que X sea siempre rojo, y mantener las propiedades del árbol a cada paso • por tanto, al descender, el nuevo P será siempre rojo, y el nuevo X y el nuevo T serán negros Estructuras de Datos M. Aldea, M. González, P. Sánchez 7/11/11 Tema 1. Técnicas de Implementación 107 4. Árboles Nodos "centinela" Para reducir los casos especiales que complicarían el algoritmo, supondremos que existen unos nodos extra o "centinelas", en lugar de los punteros nulos que haya en el árbol • uno está por encima de la raíz • si a un nodo le falta un hijo, supondremos un nodo centinela en su lugar • si un nodo es una hoja, tendrá dos centinelas en lugar de sus hijos Supondremos los centinelas negros inicialmente El algoritmo comienza haciendo que X sea el centinela por encima de la raíz, y coloreándolo de rojo Estructuras de Datos M. Aldea, M. González, P. Sánchez 7/11/11 Tema 1. Técnicas de Implementación 108 4. Árboles Eliminación en árboles rojinegros (cont.) Existen dos casos principales, además de sus variantes simétricas • caso a: X tiene dos hijos negros - subcaso a1: T tiene dos hijos negros - subcaso a2: T tiene un hijo exterior rojo - subcaso a3: T tiene un hijo interior rojo - subcaso a4: T tiene dos hijos rojos: lo resolvemos como a2 • caso b: alguno de los hijos de X es rojo Nota • un hijo es exterior si es un hijo derecho de un hijo derecho o un hijo izquierdo de un hijo izquierdo • es interior en los otros dos casos Estructuras de Datos M. Aldea, M. González, P. Sánchez 7/11/11 109 Tema 1. Técnicas de Implementación 4. Árboles Eliminación en árboles rojinegros: subcaso a1 Hacemos un cambio de color P P T X T X M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 110 Tema 1. Técnicas de Implementación 4. Árboles Eliminación en árboles rojinegros: subcasos a2 y a4 Hacemos una rotación simple entre P y T, y los cambios de color que se indican P T T X R P R X M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 111 Tema 1. Técnicas de Implementación 4. Árboles Eliminación en árboles rojinegros: subcaso a3 Hacemos una rotación doble entre T y R y luego entre P y R, y los cambios de color que se indican P R T X R Estructuras de Datos P T X M. Aldea, M. González, P. Sánchez 7/11/11 112 Tema 1. Técnicas de Implementación 4. Árboles Eliminación en árboles rojinegros: caso b Descendemos al siguiente nivel del árbol obteniendo nuevo X, T, P • Si el siguiente nodo en el descenso del árbol es rojo, continuamos por él sin necesidad de más cambios • En caso contrario estamos en esta situación viejo X P nuevo T X C B C B M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 113 Tema 1. Técnicas de Implementación 4. Árboles Eliminación en árboles rojinegros: caso b (cont.) Hacemos una rotación entre T y P P T T X B P C X C B Y ahora repetimos el algoritmo para tratar de hacer X rojo Estructuras de Datos M. Aldea, M. González, P. Sánchez 7/11/11 Tema 1. Técnicas de Implementación 114 4. Árboles Eliminación en árboles rojinegros: caso b (cont.) El algoritmo siempre finaliza, ya que está garantizado que al llegar al nodo a eliminar habremos alcanzado uno de estos dos casos • X es una hoja, que se considera que tiene dos hijos negros (caso a) • X tiene un solo hijo - si es negro, su "hermano" es un nodo centinela negro, y se aplica el caso a - si es rojo, eliminamos X y coloreamos ese hijo de negro Estructuras de Datos M. Aldea, M. González, P. Sánchez 7/11/11 115 Tema 1. Técnicas de Implementación 4. Árboles 4.7 Montículo binario Estructura de datos que nos permite gestionar un conjunto de elementos entre los que existe una relación de orden total • con operaciones de inserción y extracción eficientes (O(log n)) • permite conocer el menor elemento en tiempo constante (O(1)) Es un árbol binario: • implementable muy eficientemente mediante un array • más simple que un árbol binario de búsqueda equilibrado (AVL o rojinegro) M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 116 Tema 1. Técnicas de Implementación 4. Árboles Definición: árbol binario completo Árbol binario en el que todos sus niveles están completos salvo quizás el nivel inferior que se rellena de izquierda a derecha • su profundidad es O(log n) • Se puede implementar mediante un array y un contador con el número de nodos 12 A 1 0 B 16 C 2 3 D 4 4 10 E 5 H 2 6I J 6 8 9 10 14 F 6 A B C D E F G H I J 1 2 3 4 5 6 7 8 9 10 11 10 num 14 G 7 M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos Tema 1. Técnicas de Implementación 117 4. Árboles Definición: árbol binario completo (cont.) La altura máxima del árbol depende del tamaño del array: altura max = log 2( tamArray ) En esta estructura, para el elemento i: • El hijo izquierdo está en 2*i • El hijo derecho en 2*i+1 - si el valor sobrepasa el número de nodos (num), ello indica que ese hijo no existe • El padre está en i div 2 En la posición 0 situaremos un nodo "centinela" • un padre falso para la raíz • facilita la implementación Estructuras de Datos M. Aldea, M. González, P. Sánchez 7/11/11 118 Tema 1. Técnicas de Implementación 4. Árboles Montículo binario Un montículo binario es un árbol binario completo en que: • el padre siempre es menor que sus hijos • el menor elemento siempre es la raíz - buscar el mínimo es siempre O(1) 12 13 1 21 16 2 3 24 4 4 31 10 5 65 2 26 6 32 6 8 9 10 19 14 6 14 68 7 10 num 13 21 16 24 31 19 68 65 26 32 0 1 2 3 4 5 6 7 8 9 10 M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 119 Tema 1. Técnicas de Implementación 4. Árboles Inserción en montículos binarios Al añadir un nodo al árbol debemos hacerlo en el siguiente hueco disponible En caso de que el elemento no quedase bien ordenado, debemos desplazar el hueco • lo hacemos intercambiándolo con el padre del hueco • repetimos este paso sucesivas veces hasta alcanzar la relación de orden • a este proceso lo llamamos reflotamiento M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 120 Tema 1. Técnicas de Implementación 4. Árboles Ejemplo de inserción (paso 1) Queremos meter el elemento 14; reflotamos el hueco 12 13 12 13 21 16 24 4 65 2 Estructuras de Datos 10 31 26 6 32 6 14 19 21 68 14 16 24 4 65 2 14 19 26 6 32 6 M. Aldea, M. González, P. Sánchez 7/11/11 68 14 31 121 Tema 1. Técnicas de Implementación 4. Árboles Ejemplo de inserción (pasos 2 y 3) Queremos meter el elemento 14; reflotamos el hueco 12 13 12 13 14 16 24 4 65 2 14 19 21 26 6 32 6 68 14 24 4 65 2 31 16 14 19 21 26 6 32 6 68 14 31 En el peor caso se requieren alturamax comparaciones para insertar (O(alturamax)) M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 122 Tema 1. Técnicas de Implementación 4. Árboles Eliminación en montículos binarios Queremos eliminar el elemento mínimo, es decir, la raíz - allí queda un hueco Hay que recolocar el elemento X que ocupa la última posición • se obtiene en O(1) utilizando el contador num Hay que trasladar el hueco hasta una posición adecuada para X • elegimos el hijo más pequeño del hueco y lo movemos hacia arriba • repetimos este proceso hasta encontrar una posición apropiada para X • llamamos a este proceso hundimiento M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 123 Tema 1. Técnicas de Implementación 4. Árboles Ejemplo de eliminación (paso 1) Queremos eliminar la raíz, y recolocar X=31 12 13 14 19 4 65 2 14 29 21 26 6 Estructuras de Datos 14 16 32 6 31 68 14 16 19 4 65 2 21 26 6 32 6 M. Aldea, M. González, P. Sánchez 7/11/11 14 29 68 14 X=31 124 Tema 1. Técnicas de Implementación 4. Árboles Ejemplo de eliminación (pasos 2 y 3) Hundimos el hueco 14 14 19 16 19 4 65 2 14 29 21 26 6 32 6 16 68 14 14 29 21 65 2 31 26 6 32 6 68 14 X=31 M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos 125 Tema 1. Técnicas de Implementación 4. Árboles Ejemplo de eliminación (pasos 4 y 5) Seguimos hundiendo el hueco y colocamos X 14 14 19 26 6 65 2 19 16 21 32 6 14 29 16 26 6 68 14 65 2 X=31 21 31 14 29 68 14 32 6 En el peor caso se requiere hundir el hueco alturamax niveles (O(alturamax)) M. Aldea, M. González, P. Sánchez 7/11/11 Estructuras de Datos Tema 1. Técnicas de Implementación 126 4. Árboles Montículo binario: eficiencia de las operaciones Operación Ritmo de crecimiento obtienePrimero O(1) inserta O(log n) eliminaPrimero O(log n) busca O(n) elimina O(n)1 • Donde n es el número de nodos 1 Hay que encontrar el elemento (O(n)) antes de eliminarle Estructuras de Datos M. Aldea, M. González, P. Sánchez 7/11/11 127