Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Arboles AVL Estructura de Datos C Árboles AVL Prof.: Mauricio Solar B Prof.: Lorna Figueroa A G E D H F Primer Semestre, 2010 1 Universidad Técnica Federico Santa María - Departamento de Informática 2 Universidad Técnica Federico Santa María - Departamento de Informática Arboles AVL Arboles AVL - Ejemplos • Definición : Un árbol binario de búsqueda es AVL si, para todo nodo, se tiene que la altura de sus subárboles difiere a lo más en 1. • Se llaman árboles AVL en honor a dos matemáticos rusos, G.M. Adelson-Vel`skii y E.M. Landis, quienes idearon el método en 1962. 3 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Ejemplos de Arboles NO AVL Ejemplo 1 Ejemplo 2 4 Arboles AVL – Factor de Equilibrio • La condición de equilibrio garantiza que todas las operaciones, se resuelvan eficientemente. Ejemplo 3 • Para saber cuando se ha perdido la propiedad AVL es necesario conocer el factor de equilibrio (FE) de cada nodo afectado por la inserción o borrado. • Esto puede hacerse calculando la diferencia de altura de los subárboles para cada nodo: (altura subárbol derecho) – (altura subárbol izquierdo) 5 6 1 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Arboles AVL – Factor de Equilibrio Arboles AVL – Factor de Equilibrio • Al insertar un nuevo nodo el FE toma el valor cero ya que siempre se inserta por las hojas. • En un árbol AVL puede suceder que: • f.e. = 1 • f.e. = 0 • f.e. = -1 • Después de cada inserción hay que revisar el FE de los nodos involucrados, que serán los que componen el camino desde la raíz del árbol hasta el padre del nodo insertado. ==> ==> ==> h(der) > h(izq) h(der) = h(izq) h(der) < h(izq) • Un nodo está en desequilibrio cuando su FE > |1|. 7 8 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Ejemplos : Ejemplos : f.e. = h(der) – h(izq) f.e. = 2 f.e. = 2 f.e. = 2 – 0 ( positivo ) => desequilibrio a la derecha f.e. = 1 f.e. = h(der) – h(izq) f.e. = 2 – 0 ( positivo ) => desequilibrio a la derecha f.e. = -1 f.e. = 0 f.e. = 0 f.e. = -2 f.e. = -1 f.e. = h(der) – h(izq) f.e. = 0 – 2 ( negativo ) => desequilibrio a la izquierda f.e. = -2 f.e. = 1 f.e. = h(der) – h(izq) f.e. = 0 – 2 ( negativo ) => desequilibrio a la izquierda f.e. = 0 f.e. = 0 9 Universidad Técnica Federico Santa María - Departamento de Informática 10 Universidad Técnica Federico Santa María - Departamento de Informática Rotaciones Rotaciones simples • Para corregir el factor de equilibrio de un nodo, se realiza sobre él una rotación simple o doble. Rotaciones: secuencia de rotaciones de punteros que se intercambian cíclicamente. • Si el nodo está desequilibrado a la izquierda (FE < –1), y su hijo izquierdo tiene el mismo signo (–) hacer rotación simple a la derecha. Resultado : f.e. = -2 f.e. = 0 • Un hecho muy importante de estas rotaciones, es que se mantiene el ordenamiento del árbol, • si el árbol original era ABB, el resultado también lo seguirá siendo. 11 f.e. = -1 12 2 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Rotaciones dobles Rotaciones simples • Si el nodo está desequilibrado a la derecha (FE > +1), y su hijo derecho tiene el mismo signo (+) hacer rotación simple a la izquierda. • Si el nodo está desequilibrado a la izquierda (FE < –1), y su hijo izquierdo tiene distinto signo (+) hacer rotación doble izquierda-derecha. Resultado : Resultado : f.e. = 2 f.e. = -2 f.e. = 0 f.e. = 1 f.e. = 1 f.e. = -2 8 f.e. = -1 3 8 f.e. = 0 5 5 f.e. = 0 f.e. = 0 3 5 8 3 13 14 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Rotaciones dobles Inserción - Eliminación • Si el nodo está desequilibrado a la derecha (FE > +1), y su hijo derecho tiene distinto signo (–) hacer rotación doble derecha-izquierda. f.e. = 2 Resultado : f.e. = 0 8 8 1 3 f.e. = -1 • Se hace una inserción o una eliminación según el método tradicional del ABB. • Posteriormente se deberá analizar si se ha producido un desbalance. • Si es así, aplicar las rotaciones correspondientes para restaurarlo. 10 f.e. = 1 10 f.e. = 2 8 1 0 13 1 3 15 16 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Inserción en un AVL Inserción en un AVL Caso 1: Caso 2: Resultado : Input : 18 10 10 10 Input : 17 10 15 5 5 5 15 15 5 15 12 17 12 El árbol permanece AVL 16 16 18 Se produce desbalance en el subárbol derecho externo: se debe hacer una rotación simple a la izquierda. sigue 17 18 3 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Inserción en un AVL Inserción en un AVL Caso 2 (cont.): Caso 2 (cont.): Resultado : a 15 Rotación simple a la izquierda 10 temp 10 10 5 16 15 5 5 12 12 15 18 16 16 12 18 AVL rotIzq(AVL a) { AVL temp = a->der; a->der = temp->izq; temp->izq=a; return temp; } 19 AVL rotIzq(AVL a) { AVL temp = a->der; a->der = temp->izq; temp->izq=a; return temp; } Universidad Técnica Federico Santa María - Departamento de Informática 18 20 Universidad Técnica Federico Santa María - Departamento de Informática Inserción en un AVL Inserción en un AVL Caso 2 (cont.): Caso 2 (cont.): a a temp temp 10 10 5 5 15 15 16 12 AVL rotIzq(AVL a) { AVL temp = a->der; a->der = temp->izq; temp->izq=a; return temp; } 18 21 AVL rotIzq(AVL a) { AVL temp = a->der; a->der = temp->izq; temp->izq=a; return temp; } Universidad Técnica Federico Santa María - Departamento de Informática 18 22 Universidad Técnica Federico Santa María - Departamento de Informática Inserción en un AVL Inserción en un AVL Caso 2 (cont.): Caso 3 (cont…): Input : 4 10 10 temp 5 5 15 15 15 2 2 6 6 16 10 AVL rotIzq(AVL a) { AVL temp = a->der; a->der = temp->izq; temp->izq=a; return temp; } 16 12 4 5 12 18 Se produce desbalance en el subárbol izquierdo externo: se debe hacer una rotación simple a la derecha. sigue 23 24 4 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Inserción en un AVL Inserción en un AVL Caso 3 (cont…): Caso 3 (cont…): Resultado : 10 Rotación simple a la derecha 5 a 5 temp 15 2 2 10 10 5 6 AVL rotDer(AVL a) { AVL temp = a->izq; a->izq = temp->der; temp->der=a; return temp; } 4 4 15 15 6 2 4 25 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Inserción en un AVL Inserción en un AVL Caso 3 (cont…): Caso 3 (cont…): a temp a temp 10 5 10 5 15 2 AVL rotDer(AVL a) { AVL temp = a->izq; a->izq = temp->der; temp->der=a; return temp; } 26 6 AVL rotDer(AVL a) { AVL temp = a->izq; a->izq = temp->der; temp->der=a; return temp; } 27 6 4 15 2 AVL rotDer(AVL a) { AVL temp = a->izq; a->izq = temp->der; temp->der=a; return temp; } 28 6 4 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Inserción en un AVL Inserción en un AVL Caso 3 (cont…): Caso 4: Input : 13 10 10 temp 5 5 5 16 12 2 10 4 15 15 6 15 AVL rotDer(AVL a) { AVL temp = a->izq; a->izq = temp->der; temp->der=a; return temp; } 29 12 16 13 Se produce desbalance en el subárbol derecho interno: se debe hacer una rotación doble derecha-izquierda. sigue 30 5 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Inserción en un AVL Inserción en un AVL 10 Caso 4 (cont.): Caso 5: Input : 8 10 5 5 15 16 13 16 2 15 5 15 5 15 12 10 10 12 2 6 6 Resultado: 13 Se produce desbalance en el subárbol izquierdo interno: se debe hacer una rotación doble izquierda-derecha. 12 AVL rotDerIzq(AVL a) { a->der = rotDer(a->der); return rotIzq(a); } 10 15 sigue 5 13 16 31 32 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Inserción en un AVL Inserción en un AVL 10 1 0 5 8 • Ejercicio: insertar en un árbol AVL, inicialmente vacío, la siguiente secuencia de números enteros: 1 5 6 15 S = {100, 60, 40, 120, 140, 110, 114, 116} 2 6 5 8 8 • Dibuje la secuencia de la inserción de cada elemento y las respectivas rotaciones que sea necesario realizar. 2 Resultado : AVL rotIzqDer (AVL a) { a->izq = rotIzq(a->izq); return rotDer(a); } 6 5 2 10 8 15 34 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Inserción en un AVL Inserción en un AVL • Sea el árbol AVL siguiente. Efectuar en él la inserción de la siguiente secuencia de elementos: 120, 20 y 22. Insertar 120 : 60 60 60 30 34 100 30 90 f.e. 0 f.e. 1 16 16 f.e. 0 f.e. 2 90 30 34 16 100 100 4 12 0 34 90 120 4 4 35 36 6 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Inserción en un AVL Inserción en un AVL Insertar: 22 : Insertar 20 : f.e. -1 60 60 f.e. -2 10 0 30 34 20 100 f.e. 1 120 90 f.e. 0 10 0 30 f.e. 0 16 60 34 16 120 90 16 f.e. -1 30 4 120 90 f.e. 0 f.e. 1 20 4 20 4 22 34 f.e. 0 22 Se produce desbalance en el subárbol izquierdo interno: se debe hacer una rotación doble izquierda-derecha. 37 38 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Eliminación en un AVL Inserción en un AVL Eliminar el valor 60, considerando que si se elimina un nodo con sus dos hijos, su valor deberá ser sustituído por el menor de su hijo derecho. Resultado : 60 20 10 0 30 16 4 90 120 90 22 60 20 100 20 100 34 16 4 30 22 90 34 120 16 4 30 22 60 120 34 39 Universidad Técnica Federico Santa María - Departamento de Informática 40 Universidad Técnica Federico Santa María - Departamento de Informática Eliminación en un AVL Eliminación en un AVL Resultado de eliminar el nodo con el valor 60. Obs. No siempre el resultado de eliminar un nodo dará como resultado un árbol AVL. 90 Si se pierde la condición AVL, se deberá restaurar el factor de equilibrio. 20 10 0 16 4 30 22 Ejemplo : en el árbol anterior, eliminar el nodo con el valor 120. 120 34 41 42 7 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática HEAP HEAP • Un heap o montículo es un árbol binario casi lleno, y además parcialmente ordenado; en el que todos sus vértices internos cumplen la propiedad del montículo. • Un árbol casi lleno, está lleno hasta el penúltimo nivel y las hojas que están en el último nivel se ubican lo más a la izquierda posible. • Un árbol parcialmente ordenado es aquél que tiene todas y cada una de sus ramas, totalmente ordenadas. • Un vértice cumple la propiedad del montículo cuando su valor es mayor o igual que el de sus hijos. 98 40 95 36 35 39 22 80 94 34 43 44 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática HEAP – Ejemplos : HEAP – Ejemplos : No es heap (no es parcialmente ordenado) : Es heap : 80 65 73 15 53 68 No es heap (no es casi lleno) : 65 49 80 15 53 8 8 73 80 68 65 49 68 53 8 49 15 45 Universidad Técnica Federico Santa María - Departamento de Informática 73 46 Universidad Técnica Federico Santa María - Departamento de Informática HEAP HEAP - Implementación • En cada operación de actualización en un montículo se deben mantener las propiedades que definen su estructura. • Un montículo de mínimos en el que la mayor prioridad va asociada a valores bajos de ésta (Ej. El elemento con la mayor prioridad es el que tiene 2) 2 6 5 26 7 11 15 27 37 • Los árboles también pueden implementarse mediante una estructura lineal sin usar campos adicionales para establecer los enlaces. • Una representación secuencial estática para árboles no resulta eficiente, puesto que se desaprovechan muchos huecos. • En el caso de los árboles completos y semicompletos, al tener prácticamente todos los nodos ocupados, se puede mantener todo su contenido de forma eficiente. 13 35 48 8 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática HEAP - Implementación HEAP - Implementación • Para evitar los enlaces, habrá que establecer una fórmula que calcule la posición de cada nodo dentro de la secuencia. Esta fórmula es: • Para los hijos: Si un nodo ocupa la posición i • Su hijo izquierdo ocupa la posición 2i • Su hijo derecho la posición 2i+1. • Para el padre: Si un nodo ocupa la posición i • El padre ocupa la posición [i/2]] • Todos los nodos excepto la raíz tienen padre: • Se deja sin elemento la posición 0: • en esa posición se coloca un elemento centinela que sirva como padre de la raíz ⇒ simplificación de algunas operaciones. • Se necesita mantener un número entero que indique cuántos nodos hay actualmente en el árbol • Se debe mantener tanto el objeto a insertar como su prioridad. • La clase Elemento almacena toda esta información 49 50 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática HEAP – Operaciones HEAP - Implementación Ejemplo: Representación gráfica y mediante vector de un montículo binario de máximos, en la que la prioridad mayor va asociada a valores altos de ésta. 50 47 22 32 44 12 19 16 0 1 2 3 4 5 6 7 8 3 37 41 9 9 10 12 11 13 • Inserción en Montículos • Para insertar un nuevo elemento e en un montículo m se utiliza el siguiente algoritmo: 14 1. Se inserta e como una nueva hoja en la primera posición libre del último nivel (primer hueco libre). 50 47 22 16 12 44 32 3 37 41 2. Se “flota” el elemento e: Mientras e no se encuentre en la raíz y sea menor que su padre, se intercambia e con su padre. 19 9 52 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Creación de un montículo con 15, 11, 12, 20, 5, 16, 8 15 15 11 Creación de un montículo con 15, 11, 12, 20, 5, 16, 8 11 flotar 15 15 15 11 flotar 11 11 11 15 15 11 12 11 5 flotar 15 20 53 12 15 20 12 5 5 flotar 20 12 15 11 20 12 15 54 9 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática HEAP - Operaciones Creación de un montículo con 15, 11, 12, 20, 5, 16, 8 15 15 11 flotar 11 11 11 15 • 15 11 12 11 5 flotar 15 12 15 20 12 20 5 5 12 20 11 15 12 15 20 12 15 15 5 11 16 12 20 5 11 20 5 flotar 16 11 flotar 20 8 Borrado en montículos • En un montículo, el elemento que se elimina es la raíz: el de mayor prioridad. • algoritmo: 1. Si m tiene un único nodo, el resultado es el montículo vacío. Si m tiene dos o más nodos, se sustituye el elemento e de la última hoja con el de la raíz y se elimina la hoja. 2. Se “hunde” el elemento e. Mientras e sea mayor que alguno de sus hijos, se intercambia con el menor de sus hijos. 8 15 16 12 55 56 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática Ejemplo; eliminar sucesivamente: 5 – 8 – 11 5 12 11 20 8 15 16 20 12 8 15 16 20 5 20 16 12 15 12 15 11 20 16 16 11 8 16 11 8 11 15 8 11 12 20 Ejemplo; eliminar sucesivamente: 5 – 8 – 11 11 20 16 15 8 11 12 15 12 16 20 11 12 15 15 20 12 16 57 Universidad Técnica Federico Santa María - Departamento de Informática Universidad Técnica Federico Santa María - Departamento de Informática HEAP – Aplicación Ejemplo; eliminar sucesivamente: 5 – 8 – 11 11 15 20 12 15 20 20 12 11 12 16 15 • Cola de prioridad: semejante a cola, con la diferencia que los elementos que entran en la cola de prioridad van saliendo de ella por un orden de prioridad establecido, en lugar de por orden de llegada. • Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía. • La implementación de colas de prioridad usando una estructura lineal ordenada consigue que todas las operaciones sean de orden constante O(1) menos la inserción, que es de orden lineal O(n). • Solución: Utilizar la estructura de árbol montículo (heap), que consigue una complejidad de O(log n) tanto para la inserción como para la eliminación. 16 16 15 12 58 16 20 59 60 10 Universidad Técnica Federico Santa María - Departamento de Informática Bibliografía - Webgrafía • Introduction to Algorithms, 2nd edition. Cormen, T., Leiserson, Ch., Rivest, R. and Stein, C. MIT Press. 2001. • Data Structures and Algorithms. A. Aho, J. Hopcroft, and J. Ullman. Addison-Wesley, 1983. Traducido al castellano, 1988. • Brassard, Gilles & Bratley, Paul. Fundamentos de Algoritmia. Prentice-Hall. 1997. • Tema 4. Estructuras de Datos Avanzadas, F. Palomo L., I. Medina B. 61 11