Árboles RN Montículos - Departamento de Ingeniería de Sistemas

Anuncio
Á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
Descargar