Árboles RN Montículos Estructuras de Datos Andrea Rueda Pontificia Universidad Javeriana Departamento de Ingeniería de Sistemas Árbol AVL Árbol AVL ● Balanceo → cuatro posibilidades que requieren rotación Diferencia entre alturas de hijos (izq - der) – Si diferencia == 2 (izquierdo más alto que derecho) Diferencia entre alturas de hijos (izq - der) del hijo izquierdo - Si diferencia > 0 → rotación a derecha - Si diferencia < 0 → rotación izquierda-derecha Árbol AVL ● Balanceo → cuatro posibilidades que requieren rotación Diferencia entre alturas de hijos (izq - der) – Si diferencia == -2 (derecho más alto que izquierdo) Diferencia entre alturas de hijos (izq - der) del hijo derecho - Si diferencia < 0 → rotación a izquierda - Si diferencia > 0 → rotación derecha-izquierda Árboles RN (Rojo-Negro) (Red-Black Trees) Árboles RN ● Árboles Rojo-Negro (Red-Black trees): Inicialmente conocido como Árbol-B binario simétrico. Guibas, Leo J., and Robert Sedgewick. "A dichromatic framework for balanced trees." 19th Annual Symposium on Foundations of Computer Science. IEEE, 1978. Árboles RN ● Árboles Rojo-Negro (Red-Black trees): Como los árboles AVL, garantiza que las operaciones de búsqueda, inserción y eliminación en un árbol binario ordenado toman en el peor caso O(log n). Requiere que el nodo del árbol incluya una propiedad adicional de color (rojo o negro). Árboles RN ● Propiedades a garantizar: 1. Cada nodo es rojo o negro. 2. La raíz y las hojas (nulos) son siempre negras. 3. Si un nodo es rojo, entonces su padre es negro. 4. Cada nodo rojo debe tener dos hijos negros. 5. Todas las rutas desde un nodo x hacia un descendiente hoja tienen el mismo número de nodos negros (altura-negra(x)). Árboles RN NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL Árboles RN ● Inserción: Se realiza como en un árbol binario ordenado. ¿Cuál debe ser el color del nuevo nodo? – Negro, causa una diferencia en el número de nodos negros en una ruta, incumpliendo la propiedad 5, y es una situación más difícil de corregir. Árboles RN ● Inserción: Se realiza como en un árbol binario ordenado. ¿Cuál debe ser el color del nuevo nodo? – Entonces siempre lo pintaremos rojo. ¿Y si el padre del nodo es rojo? – Se incumple la propiedad 3, pero se puede arreglar con rotaciones o cambiando el color de los ancestros. Árboles RN ● Inserción: Caso 1: el nodo insertado es la raíz del árbol (primera inserción en un árbol vacío). - en este caso, el nodo se repinta a negro, para cumplir la propiedad 2. 11 NULL 11 NULL NULL NULL Árboles RN ● Inserción: Caso 2: el padre del nodo insertado es negro. - en este caso, el árbol es válido sin ninguna modificación. 11 2 NULL 11 2 NULL NULL NULL 14 NULL NULL NULL Árboles RN ● Inserción: Caso 3: el padre del nodo insertado es rojo, se analizan varias situaciones: – Situación 1: Que el tío del nodo (hermano del padre) sea rojo. En ese caso, se cambia el color del padre, del tío y del abuelo. Árboles RN 11 2 1 14 15 7 5 8 Insertar 4 Árboles RN 11 2 1 14 5 11 15 7 8 Insertar 4 2 1 14 15 7 5 4 nuevo 8 Árboles RN 11 2 1 14 15 7 5 4 nuevo 8 tío Árboles RN 11 2 1 14 5 4 nuevo 11 15 7 8 tío 2 1 14 15 7 5 4 8 Árboles RN 11 2 1 14 5 4 nuevo 11 15 7 8 tío 2 1 14 7 5 4 problema! 8 15 Árboles RN ● Inserción Caso 3: el padre del nodo insertado es rojo, se analizan varias situaciones: – Situación 2: Que el tío del nodo (hermano del padre) sea negro y el nodo sea el hijo derecho del padre. En ese caso, se aplica una rotación a izquierda sobre el nodo. Árboles RN 11 14 tío hijo derecho 15 2 1 7 5 4 8 Árboles RN 11 14 tío hijo derecho 15 2 1 7 5 11 7 8 2 4 14 8 5 1 4 15 Árboles RN 11 14 tío hijo derecho 15 2 1 7 5 4 11 7 8 problema! 2 14 8 5 1 4 15 Árboles RN ● Inserción Caso 3: el padre del nodo insertado es rojo, se analizan varias situaciones: – Situación 3: Que el tío del nodo (hermano del padre) sea negro y el nodo sea el hijo izquierdo del padre. En ese caso, se cambia el color del padre y del abuelo, y luego se aplica una rotación a derecha sobre el abuelo. Árboles RN 11 7 hijo izquierdo 2 14 8 5 1 4 tío 15 Árboles RN 11 7 hijo izquierdo 2 tío 14 15 8 11 5 1 4 14 7 hijo izquierdo 2 8 5 1 4 tío 15 Árboles RN 11 7 hijo izquierdo 2 14 tío 15 8 7 5 1 11 2 4 5 1 4 8 14 15 Árboles RN ● Eliminación: Se consideran los mismos casos de eliminación que en un árbol binario ordenado: – Eliminar un nodo hoja. – Eliminar un nodo con un solo hijo (derecho o izquierdo). – Eliminar un nodo con dos hijos. Árboles RN ● Eliminación: ... pero además hay que tener en cuenta el color del nodo a eliminar ... Si se elimina un nodo rojo, usualmente las propiedades se siguen manteniendo. Si se elimina un nodo negro, es necesario identificar las opciones de cambio de color y rotación para garantizar las propiedades del árbol. Árboles RN ● Applets de demostración http://gauss.ececs.uc.edu/RedBlack/redblack.ht ml http://www.cs.usfca.edu/~galles/visualization/R edBlack.html Árbol RN en la STL ● ● #include <set> – std::set< T > – std::multiset< T > #include <map> – std::map< K, T > – std::multimap< K, T > STL: std::set< T > ● ● Se “ve” como una lista ordenada de elementos únicos. T debe ser un tipo de “ordenamiento estrictamente débil” (strict weak ordering). – i.e. Debe existir el operador “<” para T. std::set< T >::insert( const T& v ); std::set< T >::erase( iterator pos ); std::set< T >::[r]begin( ); std::set< T >::[r]end( ); STL: std::map< K, T > ● ● Se “ve” como un vector dinámico de índices de elementos únicos. K debe ser un tipo de “ordenamiento estrictamente débil” (strict weak ordering). – i.e. Debe existir el operador “<” para K. std::map< int, float > v; ↔ float v[ MAX ]; std::map< K, T >::iterator it; it­>first; // K it­>second; // T Montículos (heaps) Montículo (heap) ● Estructura basada en árboles completos: Todos los niveles, salvo el último, tienen el máximo número de nodos posibles. En el último nivel, si no está lleno, todos los nodos deben estar concentrados hacia el lado izquierdo. Montículo (heap) ● Satisface la propiedad: Si A es el nodo padre de B, el valor de A está ordenado con respecto al valor de B con la misma propiedad de ordenamiento a lo largo del montículo. ● ● Montículo máximo (max heap): si el valor del padre es siempre mayor o igual que el valor de sus hijos (máximo en la raíz). Montículo mínimo (min heap): si el valor del padre es siempre menor o igual que el valor de sus hijos (mínimo en la raíz). Montículo (heap) ● No importa la relación de orden entre hermanos. Ejemplo max heap: 15 12 9 10 3 6 5 2 8 1 7 0 Montículo (heap) ● No importa la relación de orden entre hermanos. Ejemplo min heap: 1 5 2 8 13 7 10 9 3 11 6 4 Montículo (heap) ● Inserción: Puede requerir el restablecimiento de la propiedad de ordenamiento del montículo. 1. Añadir el elemento en la “última” posición. 2. Comparar el valor del nodo con su padre: 2.1 si están en el orden correcto, terminar. 2.2 si no, intercambiar el elemento con su padre y retornar al paso 2. Depende de la altura del montículo → O(log n). Montículo (heap) ● Inserción: insertar 11. 15 12 9 10 3 6 5 2 8 1 7 0 Montículo (heap) ● Inserción: insertar 11. 15 12 9 10 3 6 5 2 8 1 7 0 11 Montículo (heap) ● Inserción: insertar 11. 15 12 9 10 3 6 5 2 11 1 7 0 8 Montículo (heap) ● Inserción: insertar 11. 15 12 11 10 3 6 5 2 9 1 7 0 8 Montículo (heap) ● Eliminación: Corresponde a eliminar el nodo de la raíz, y restaurar la propiedad de ordenamiento. 1. Reemplazar la raíz con el “último” elemento. 2. Comparar la nueva raíz con sus hijos: 2.1 si están en el orden correcto, terminar. 2.2 si no, intercambiar el elemento con uno de sus hijos (el mínimo en min heap y el máximo en max heap) y retornar al paso 2. Depende de la altura del montículo → O(log n). Montículo (heap) ● Eliminación: 15 12 11 10 3 6 5 2 9 1 7 0 8 Montículo (heap) ● Eliminación: 15 12 11 10 3 6 5 2 9 1 7 0 8 Montículo (heap) ● Eliminación: 8 12 11 10 3 6 5 2 9 1 7 0 Montículo (heap) ● Eliminación: 12 8 11 10 3 6 5 2 9 1 7 0 Montículo (heap) ● Eliminación: 12 10 11 8 3 6 5 2 9 1 7 0 Montículo (heap) ● Implementación: Representación utilizando un arreglo: 0 1 3 2 4 5 6 No se requieren apuntadores, sólo aritmética de índices dentro del arreglo. Montículo (heap) ● Implementación: aritmética de índices: n: número de elementos en el montículo. i: índice dentro del arreglo (0 hasta n­1). Raíz: posición (índice) 0 del arreglo. Cualquier elemento a con índice i tiene. – sus hijos en las posiciones 2i+1 y 2i+2. – su padre en la posición ⌊(i­1)/2⌋ (⌊...⌋: función piso). Montículo (heap) ● Implementación: 12 10 11 8 6 9 0 3 5 2 1 12 10 11 8 3 6 5 2 9 1 7 0 7 Montículo (heap) ● Implementación: usando STL: #include <algorithm> std::push_heap( it_begin, it_end ) std::pop_heap( it_begin, it_end ) std::is_heap( it_begin, it_end ) std::sort_heap( it_begin, it_end ) std::make_heap( it_begin, it_end ) Montículo (heap) ● Implementación: usando STL: Inserción: std::deque< T > vec; while( there_is_data ) { T new_data = get_next_data( ); vec.push_back( new_data ); std::push_heap( vec.begin( ), vec.end( ) ); } Montículo (heap) ● Implementación: usando STL: Eliminación: std::deque< T > vec; std::pop_heap( vec.begin( ), vec.end( ) ); T elim_data = vec.back( ); vec.pop_back( ); Montículo (heap) ● Ejercicio: Insertar los siguientes elementos en un montículo máximo: 12, 6, 14, 2, 13, 8, 19, 5, 1, 11, 21, 10, 7, 3 Montículo (heap) 21 19 14 5 13 10 12 2 1 6 11 8 7 3 21 19 14 5 2 13 1 6 10 11 8 12 7 3 Montículo (heap) ● Ejercicio: Insertar los mismos elementos, ahora en un montículo mínimo: 12, 6, 14, 2, 13, 8, 19, 5, 1, 11, 21, 10, 7, 3 Montículo (heap) 1 2 3 5 11 8 7 12 6 13 21 14 10 19 1 2 3 5 12 11 6 13 8 21 14 7 10 19 Árboles ● Implementaciones de: - Árbol general (Arbol), nodo general (Nodo). - Árbol binario ordenado (ArbolBinarioOrd), nodo binario (NodoBinario). - Árbol AVL (ArbolAVL), nodo AVL (NodoAVL). - Árbol RN (implementación STL). - Montículo máximo (implementación STL). Referencias ● ● ● ● L. Joyanes Aguilar, I. Zahonero. Algoritmos y estructuras de datos: una perspectiva en C. McGraw-Hill, 2004. www.cs.duke.edu/~reif/courses/alglectures/skiena.l ectures/lecture10.pdf www.cse.ohiostate.edu/~gurari/course/cis680/cis680Ch11.html www.stolerman.net/studies/cs521/red_black_trees. pdf ● http://lcm.csa.iisc.ernet.in/dsa/node114.html ● en.wikipedia.org/wiki/Red-black_tree