Download Cap_4(tda_Red_Black)_2008

Document related concepts

Árbol AA wikipedia , lookup

Árbol biselado wikipedia , lookup

Árbol AVL wikipedia , lookup

Árbol-B wikipedia , lookup

Árbol binario de búsqueda wikipedia , lookup

Transcript
ÁRBOLES
RED-BLACK
Introducción
Los árboles RED-BLACK son un tipo de árbol binario de búsqueda (ABB) con la
particularidad de ser balanceados lo que nos asegura un tiempo en las operaciones básicas
(insertar, buscar, eliminar) de O(lg n) en el peor de los casos.
Un ABB es un RED-BLACK si cumple con las siguientes propiedades:
-
Todos sus nodos son negros o rojos.
Toda hoja (entiéndase por hoja a los hijos de un nodo que no contienen datos) es
negras.
Si un nodo es rojo, entonces sus dos hijos son negros.
Todo camino simple desde un nodo a una hoja descendiente tiene el mismo
número de nodos negros.
Ejemplo de un árbol RED-BLACK:
3
1
0
5
2
4
8
DEFINICION
Los arboles RED-BLACK son un tipo de arboles de búsqueda binaria, donde sus
nosos son de color negro o rojos, pero tienen la propiedad de ser balanceados, el
ser de tipo ABB significa que el insertar, buscar o eliminar en el peor de los casos
el costo de las operaciones es Ο(logn) en el peor de los casos.
Para que un arbol sea un RED-BLACK debe cumplir con las siguientes
propiedades:
1)
2)
3)
4)
Todo nodo deber ser rojo o negro.
Su raiz debe ser negra.
Toda hoja del arbol debe ser Negra.
Si un nodo en rojo su hijo debe ser negro.
2
5) Todo camino simple de un nodo a la hoja tiene el mismo numero de nodos
negro.
5
5
6
3
3
1
8
4
7
9
La fig muestra un ejemplo del Red Black
ESTRUCTURA DE UN NODO RED-BLACK
Tipo
Nombre
Comparable
Int
Nodo_RedBlack
Nodo_RedBlack
Nodo_RedBlack
Datos
Color
izq
der
Padre
INSERTAR
Como sabemos la inserción de este arbol es igual que el insertado en un arbol
binario, pero con la propiedad de que el nodo insertado siempre va ser rojo.
Luego de tener insertado el nodo en el árbol se rompera la propiedad Red-Black si
y solo si el padre es rojo, si el padre es negro no existen problemas tal como se ve
en este ejemplo, en el que se ha insertado C y su padre es rojo:
B
A
3
(Recordar que nunca un nodo rojo tiene un padre rojo.)
Ahora que se ha insertado el nodo y se rompió una propiedad, existen 2 formas de
arreglarlo.
Caso 1°
Si el tío del nodo es rojo se recolorea el padre, el abuelo y el tío como se ve en la
figura:
C
B
C
D
B
A
D
A
Como se ve el tío de A es D y es rojo, por lo que B (padre), D(tío) y A(abuelo) se
recolorean, si C fuera raiz se colorea negro nuevamente.
Caso 2°
Si el tío es negro se aplica una rotación simple o doble y se recolorea de esta
forma, el tipo de rotación depende de en que posición están el padre y el nodo a
que causa el problema, esto es, si el nodo con problemas y el padre son ambos
hijos derechos o ambos hijos izquierdos se hace una rotación simple y sino una
rotación doble.
C
B
A
C
D
A
B
C
D
4
Rotación Doble
(Acá se ve como A es hijo derecho de B, y B es hijo izquierdo de C entonces corresponde una
rotación doble)
Cuando el padre tiene en el mismo sentido que el nodo con insertado se hace una
rotacion simple.
C
B
B
A
C
A
Rotacion Simple
(Acá se ve como A es hijo izquierdo de B y B es hijo izquierdo de C)
El costo de insertar en un arbol RED-BLACK es de Ο(log n).
EJEMPLO DE INSECION
Se insertaran los siguientes nodos en un árbol Red-Black
5
8
3
2
1
6
7
9
Se inserta el 5, queda negro porque es la raíz.
5
Caso 1
5
5
5
8
5
3
8
3
Como 5 es raíz
se pinta negro
2
5
8
3
2
8
3
6
8
3
Como 2 es hijo izq.
y 1 también, rotación
simple
Caso 2
5
5
1
2
1
1
2
5
8
2
5 debería ser rojo,
como es raíz es
negro
Tío es rojo y
padre también
Caso 2
5
3
8
2
1
8
3
6
7
Como 6 es hijo izq.
y 7 también, rotación
doble
6
5
5
Caso 1
2
1
7
3
2
6
1
8
7
3
6
8
9
Como tío de9 es rojo
se recolorea
5
2
1
7
3
6
8
9
Lema: Un árbol RED-BLACK con “n” nodos internos, tiene altura a lo mas 2*lg(n+1).
7
Estructura de un nodo para un árbol RED-BLACK
TIPO
Booleano
Tipo_Clave
Nodo
Nodo
Nodo
NOMBRE
Color
Valor
Hijo_Izq
Hijo_Der
Padre
Utilidad, ventajas y desventajas
Los árboles Red-Black son útiles cuando los valores que contienen los nodos tienen la
misma probabilidad de ser accedidos, esto significa que su estructura permite tener en
general el mismo tiempo de acceso para todos los nodos (logN), tales como aplicaciones de
control de usuarios en una red de Internet, por lo que no es recomendable usarlo en
aplicaciones en las que algunos datos tienen prioridad sobre otros y se desea que estos se
encuentre lo mas cerca posible de la raíz.
Entre las ventajas en este tipo de árboles se encuentran:
1° La facilidad de implementación: Este es un ABB con un identificador adicional, por lo
que se puede reutilizar código de un ABB, la búsqueda es la misma.
2° El tamaño de los nodos es pequeño, ya que tiene 3 punteros a nodos (padre, hijo
derecho, hijo izquierdo), el dato y un BIT para identificar el color, esto se traduce en que, el
tamaño que los datos fuera del árbol ocupan es prácticamente el mismo tamaño que ocupará
el árbol construido en memoria.
3° La estructura asegura un tiempo de inserción, búsqueda y eliminación proporcional a
Log N, por ejemplo si la cantidad de datos en el árbol es 1.000.000 el costo para cualquiera
de las operaciones básicas es alrededor de O(20).
8
Búsqueda
Como se explico anteriormente un árbol Red-Black es un árbol binario de búsqueda
balanceado, el balanceo se hace por medio de la coloración de los nodos pero esta no tiene
ninguna significancia en la búsqueda así que se hace de la misma forma que en un ABB.
Ejemplo
Se tiene el siguiente árbol y se va a buscar el valor 4 en él.
1- 4 es menor que 5 así que busca en el sub árbol izquierdo de 5.
2- 4 es mayor que 3 así que busca en el sub árbol derecho de 3.
3- 4 es igual a 4 así que se retorna ese nodo.
Si no hubiera encontrado el nodo habría hecho 3 comparaciones, esto corresponde con la
altura de el árbol, dado que los árboles Red-Black son balanceados la altura del árbol no
supera los 2*logN+1, esto significa que el árbol puede desbalancearse a lo mas el doble
hacia un lado, lo que ocurre en el caso de que el sub árbol mas largo contiene nodos rojos y
negros alternados y el sub árbol mas corto contiene solo nodos negros.
De esto se deduce que la búsqueda tiene un costo proporcional a logN.
9
Inserción:
Este tipo de árboles provee una implementación y entendimiento fáciles en relación a la
inserción con respecto a otras estructuras de búsqueda.
Cuando se inserta un nodo al árbol este nuevo nodo siempre va a ser rojo, este se inserta al
árbol como en cualquier otro árbol binario.
Luego de tener insertado el nodo en el árbol se va a romper la propiedad Red-Black si y
solo si el padre es rojo, si el padre es negro no existen problemas tal como se ve en este
ejemplo, en el que se ha insertado C y su padre es rojo:
(Recordar que nunca un nodo rojo tiene un padre rojo.)
Ahora que se ha insertado el nodo y se rompió una propiedad, existen 2 formas de
arreglarlo.
Caso 1° Si el tío del nodo es rojo se recolorea el padre, el abuelo y el tío como se ve en la
figura:
Como se ve el tío de C es D y es rojo, por lo que B (padre), D(tío) y A(abuelo) se
recolorean.
10
Caso 2°
Si el tío es negro se aplica una rotación simple o doble y se recolorea de esta forma, el tipo
de rotación depende de en que posición están el padre y el nodo a que causa el problema,
esto es, si el nodo con problemas y el padre son ambos hijos derechos o ambos hijos
izquierdos se hace una rotación simple y sino una rotación doble.
Rotación Doble
(Acá se ve como C es hijo derecho de B, y B es hijo izquierdo de A entonces corresponde
una rotación doble)
En este caso 0 es hijo izquierdo y el padre (1)
hijo izquierdo por lo que se hace una rotación
simple sobre 1 en la que el árbol queda de esta
forma:
es
(Como se puede notar se supone que las hojas
tienen hijos negros)
Rotación Simple
Resumen: La inserción se hace de la misma forma que en un ABB, cuando se producen
problemas al insertar un nodo si su tío es rojo se recolorea, si su tío es negro se rota y
después se recolorea, el tipo de rotación depende de la orientación del nodo insertado y de
la orientación del padre, si son iguales se rota simple, si son distintas se hace la rotación
doble.
11
Ejemplo de Inserción:
Se insertaran los siguientes nodos en un árbol Red-Black
En los gráficos I=Insertar, C=Colorear, R=Rotar.
Se inserta el 5, queda negro porque es la raíz.
Se inserta el 2 y el 8 y no hay problemas.
Se inserta el 3 y su padre (2) es rojo así que se procede a ver que tipo de problema es, como
su tío (8) es rojo, solo se recolorea.
Ahora se inserto el (4) y su padre es
rojo y su tío es negro así que sabemos
que hay que rotar y colorear. Como el
nodo (4) es hijo derecho y el padre(3)
también se hace una rotación simple
y la recoloración.
12
Ahora insertamos el 1 y no causa problemas pero insertamos el 0 y si causa problemas,
como se aprecia su padre es rojo y su tío es negro así que hay que rotar, como el padre (1) y
el nodo (0) son ambos hijos izquierdos (tienen la misma orientación) se hace una rotación
simple y recoloración.
Al recolorear el (1) hace problemas y su tío (8) es negro, como el (1) y su padre (3) son
hijos izquierdos se hace una rotación simple y se recolorea nuevamente y el árbol final
queda así:
Obs.: Recordar que el paso final es hacer siempre hacer la raíz negra.
Costo: La inserción consiste en la ubicación del nodo en una hoja y un número de
intercambio de punteros y coloraciones que no depende de la cantidad de nodos en el árbol,
por lo que tiene un costo proporcional a la altura, esto significa: logN.
13
Eliminación:
La eliminación de un dato en un árbol RED-BLACK consta de dos pasos, primero
se procede con el mismo método de eliminación en un ABB normal, es decir buscar el
elemento a eliminar y remplazarlo por el mayor de sus descendientes reduciendo el
problema a la eliminación de una hoja; luego se procede a restablecer las propiedades para
el balanceo de un RED-BLACK.
El método siguiente para la eliminación se basa en la idea de que, el eliminar un
nodo rojo no afecta las propiedades del árbol RED-BLACK por lo que no se produce
ningún problema, pero al eliminar un nodo negro se rompe la propiedad numero 4 (todo
camino simple desde un nodo a una hoja descendiente tiene el mismo número de nodos
negros), es decir, faltaría un nodo negro en todos los caminos que pasaban por el nodo
eliminado, en otras palabras, quedamos “debiendo” un nodo negro en esos caminos, por lo
que es necesario tomar ciertas medidas para restablecer el árbol, con este fin marcamos la
hoja que reemplaza al nodo eliminado con un marcador de negro; como todas las hojas son
siempre negras, esta en particular será “doblemente negra”, situación que debemos
solucionar llevando el marcador de negro hasta un nodo rojo, lo que hará que este nodo
pase a ser negro.
Se puede presentar uno de ocho casos, de los cuales analizaremos solo 4, pues
depende de la orientación que tenga el nodo a eliminar (si es hijo derecho o hijo izquierdo)
y la solución en ambos casos es simétrica.
CASO 1:
Se presenta cuando el hermano de la hoja doblemente negra es negro y su hijo izquierdo es
rojo.
SOLUCION:
Realizamos una rotación simple, y el hermano de x toma el color del padre y el padre toma
el color negro, el marcador de doble negro se elimina automáticamente.
A
C
X
C
A
B
B
X
14
CASO II:
Si el sobrino de x es hijo derecho, intercambiamos los colores del hermano y sobrino de x y
realizamos una rotación simple, lo que nos lleva al caso anterior.
A
A
X
B
X
C
C
B
CASO III:
Se presenta cuando el hermano y ambos sobrinos de la hoja doblemente negra son negros.
SOLUCION:
Hacemos subir el marcador negro un nivel “quitando un negro” en el nivel original.
A
A
X
B
X
B
15
CASO IV:
Se presenta cuando el hermano de la hoja doblemente negra es rojo.
SOLUCION:
Intercambiando los colores del padre y el hermano del nodo doblemente negro y realizando
una rotación se convierte en un caso del tipo I, II o III.
A
B
A
B
X
X
C
D
C
D
16
Ejemplo de eliminación:
Eliminaremos todos los nodos de un árbol en el siguiente orden:
1, 12, 7, 15, 18, 20, 8, 13, 9.
9
9
7
Eliminar (1)
15
1
8
12
7
18
13
15
8
12
20
7
Marcador
en la raíz:
se elimina
9
15
8
18
13
20
7
15
12
18
13
Se presenta
el caso 2
nuevamente
9
8
Se presenta
el caso 2
20
12
18
13
20
17
9
9
7
Eliminar (12)
15
8
12
7
15
8
18
13
20
9
7
7
18
13
20
Como 12 es rojo
se elimina
9
12
15
15
8
8
13
13
18
18
20
12
20
18
9
9
Eliminar (7)
7
8
15
8
13
Como 7 es rojo,
simplemente se
elimina
15
7
18
13
18
20
20
9
9
8
Eliminar (15)
15
13
15
18
13
20
9
8
8
20
9
Se produce
el caso 1
13
18
8
18
18
20
13
20
9
9
13
Eliminar (9)
13
13
13
9
9 es rojo
en su
nueva
posición,
se elimina
sin
problemas
Solo nos
queda 13,
simplemente
se borra
19
Red-Black y 2-3-4
Existe una relación entre un árbol Red-Black y un 2-3-4, esto significa que podemos pasar
un árbol 2-3-4 a un árbol Red-Black. La relación de la que se habla es muy estrecha por lo
que hacer esta conversión no implica nuevos cálculos ni reestructuración de ninguno de los
2 árboles.
El método de conversión consiste en convertir cada nodo en el árbol 2-3-4 en una
combinación que se sabe de antemano de nodos Red-Black. La conversión de nodos se
hace de la siguiente forma como se muestra en la figura:
Cada 2-nodo queda igual y de color negro.
Cada 3-nodo (2 claves 3 hijos) se transforma en un negro y un rojo.
Y cada 4-nodo (3 claves 4 hijos) se transforma en 1 negro y dos rojos:
Ya que los árboles 2-3-4 tienen la propiedad de que todas las hojas están a la misma
distancia de la raíz y en la conversión cada nodo 2-3-4 se convierte en una combinación de
nodos Red-Black pero siempre con 1 nodo negro, el árbol Red-Black contendrá siempre la
misma cantidad de nodos negros desde la raíz hasta las hojas, esto permite que después de
la conversión de los nodos se tenga un árbol Red-Black cumpliendo todas las propiedades y
no halla que hacer ningún cambio ni comprobación de las propiedades.
20
Ejemplo de conversión de un árbol 2-3-4 en un Red-Black
Aquí se puede apreciar como cada nodo 2-3-4 fue transformado en su equivalente
combinación de nodos Red-Black
21
Aplicación.
Como ya lo dijimos anteriormente los árboles balanceados como son en este caso
los RED-BLACK resultan ventajosos en aplicaciones en las cuales es necesario acceder a
los datos en forma uniforme, es decir, no existe una prioridad conocida para ciertos datos
sobre otros. Es por esta razón que hemos decidido utilizar esta estructura para implementar
una aplicación que controle el acceso de los usuarios a un sistema cualquiera. La aplicación
controlara los datos de identificación de usuarios (login o nombre de usuario y su respectiva
password) permitiendo lograr un bajo costo en la búsqueda (para comparar que los datos
ingresados por el usuario sean correctos) y mantención de la lista de usuarios registrados.
22