Professional Documents
Culture Documents
Operaciones auxiliares:
equilibrar(NodoABB actual)
desplazarDerecha(NodoABB actual, int cuantos)
desplazarIzquierda(NodoABB actual, int cuantos)
Modificar algoritmos de inserción/borrado
- Re-equilibrado se hace desde arriba hacia abajo
BST perfectamente equilibrados
Arboles AVL - Definición
Un árbol AVL (Adelson-Velskii y Landis) es un árbol
binario de búsqueda equilibrado
Para cada nodo, las alturas de sus subárboles izquierdo y
derecho no difieren en más de 1
El coste de sus operaciones es, por lo tanto, logarítmico
El algoritmo para mantener un árbol AVL equilibrado se
basa en reequilibrados locales, de modo que no es
necesario explorar todo el árbol después de cada
inserción o borrado
Arboles AVL – Factor de equilibrio
Cada nodo, además del dato y de las referencias a su
subárbol izquierdo y derecho, tiene un nuevo atributo: el
factor de equilibrio
El factor de equilibrio es la diferencia entre las alturas
del subárbol derecho y el izquierdo:
FE = HDer – HIzq
Por definición, para un árbol AVL, este valor debe ser -1,
0ó1
Árboles AVL - reestructuración
-1
1 65
-1
45 70
0 -1 0
33 54 68
0 RSD
50 Simple
RSI
Rotación
RDD
Compuesta
RDI
Árboles AVL – rotación simple derecha (RSD)
Cuando el subárbol izquierdo de un nodo es 2 unidades
más alto que el derecho (FE = -2) y la raíz del subárbol
izquierdo tenga un FE = -1 (cargado a la izquierda)
P
Q
Árboles AVL – rotación simple derecha (RSD)
Paso 1: el subárbol derecho de Q pasa a ser el subárbol
izquierdo de P
R
Árboles AVL – rotación doble derecha (RDD)
Paso 1: el subárbol izquierdo de R pasa a ser el
subárbol derecho de Q
2. Se inserta el elemento.
5 5 5 5
insert(9)
3 7 3 7 3 7 3 7
X 9 9 9
Restauración en la inserción
Caso 2: El padre de X es rojo, el tío de X es negro (o nill), X
es el hijo derecho (o izquierdo) de su padre, y el padre de X
es hijo izquierdo (o derecho) del abuelo:
Realizar una RSI (o RSD) en el padre de X
El nuevo X es el que era padre de X
Se obtiene el caso 3.
5 5 5 RSI(padre) 5
insert(8)
3 9 3 9 3 9 3 9
1 1 1 1
6 6 6 8
8 8 6
RSI
X X
Restauración en la inserción
Caso 3: El padre de X es rojo, el tío de X es negro (o nill), X
es el hijo derecho (o izquierdo), y el padre de X es hijo
derecho (o izquierdo) del abuelo:
Cambiar el color del padre de X a Negro
Cambiar el color del abuelo de X a Rojo
Realizar una RSD (RSI) en el abuelo de X.
5 5 RSD
5
3 9 3 9
3 8
1 8 1 8
1 6 9
X 6 X 6
Restauración en la inserción
11
void colourRestore (NodeRBT *X) {
NodeRBT *Y;
while (X!=root && X->father->colour==RED) y
7 14
{ if (X->father==X->father->father>left){
Y = X->father->father->right; x
if (Y && Y->colour==RED) 2 8
{ X->father->colour=BLACK; 15
Y->colour=‘black’;
X->father->father->colour=RED; 1 5
X=X->father->father;
}
else { 4
if (X==X->father->right){ Caso 3
X=X->father;
rotateLeft (X);
}
X->father->colour=BLACK; 7
X->father->father->colour=RED; Caso 3
rotateRight (X->father->father);
} 2 11
}
else{
//simétrico 1 5 8 14
}
}
root->colour=BLACK; 4 15
}
Operaciones: Eliminación de X
Se procede a eliminar X utilizando el algoritmo de BST
Opcionalmente es necesario usar un nodo ficticio NILL
Restaurar el color cuando el nodo a eliminar es
Negro
Se invalida la 4ta. Propiedad
Dados:
x es el nodo que reemplazará el nodo a eliminar
w es el hermano de x
F[x] es el padre de x
L[x] es el hijo izquierdo de x
R[x] es el hijo derecho de x
colour[x] color de x
Restauración en la Eliminación
Caso 1: Si color de hermano w es rojo (colour[w]==RED)
Cambiar el color del hermano w a negro
Cambiar el color del padre de X a rojo
Realizar RSI en el padre de X
El nuevo w es el hijo derecho del padre de X
Verificar demás casos
if (colour[w] == RED)
colour[w] = BLACK
colour[F[x]] = RED
rotateLeft(F[x])
w = R[F[x]]
Restauración en la Eliminación
Caso 2: Si los dos hijos del hermano w son negros
(colour[L[w]] == BLACK colour[R[w]] == BLACK)
Cambiar el color del hermano w a rojo
El nuevo X es el padre de X
Verificar todos los casos
if (colour[L[w]]==BLACK
colour[R[w]]==BLACK)
colour[w] = RED
x = F[x]
Restauración en la Eliminación
Caso 3: Si el color del hijo derecho del hermano w es negro
y el izquierdo es rojo (colour[R[w]] == BLACK)
Cambiar el color del hijo izquierdo de w a negro
Cambiar el color de w a rojo
Realizar RSD en el w
El nuevo w es el hijo derecho del padre de X
Efectuar Caso 4.
if (colour[R[w]]==BLACK)
colour[L[w]] = BLACK
colour[w] = RED
rotateRight(w)
w = R[F[x]]
Restauración en la Eliminación
Caso 4: El hijo derecho del hermano w es rojo (el izquierdo
no interesa)
w toma el color del padre de X
El padre de X cambia a negro
Cambiar el color del hijo derecho de w a negro
Realizar RSI en el padre de X
El nuevo X es la raíz
colour[w] = colour[F[x]]
colour[F[x]] = BLACK
colour[R[w]] = BLACK
rotateLeft(F[x])
x = root
Restauración en la Eliminación
procedure restoreRB ( T, x) {
while (x <> root[T] colour[x] == BLACK)
if (x== L[F[x]])
w = R[F[x]]
if (colour[w] == RED)
colour[w] = BLACK Caso 1
colour[F[x]] = RED
rotateLeft(F[x])
w = R[F[x]]
if (colour[L[w]]==BLACK colour[R[w]]==BLACK)
colour[w] = RED Caso 2
x = F[x]
else
if (colour[R[w]]==BLACK)
colour[L[w]] = BLACK Caso 3
colour[w] = RED
rotateRight(w)
w = R[F[x]]
colour[w] = colour[F[x]]
colour[F[x]] = BLACK Caso 4
colour[R[w]] = BLACK
rotateLeft(F[x])
x = root[T]
else // simetrico
colour[x] = BLACK
Ejercicio
Elimine las siguientes claves a partir del RBT de la
figura (use la estrategia del antecesor en inorden): 20,
4, 9, 16, 18
4 16
2 6 10 20
1 3 5 7 18 40
8
AVL vs. RBT
AVL RBT
Inserción, eliminación y Inserción, eliminación y
búsqueda en O(log n). búsqueda en O(log n).
Rotaciones: máximo 2. Rotaciones: máximo 3.
Diferencia entre el camino mas Diferencia entre el camino mas
corto y el mas largo es máximo corto y el mas largo puede ser
1. 2.
Más simples de implementar Implementación mas compleja.
Balanceo cuando hay una Retarda el balanceo al máximo
diferencia de +2 o -2 El balanceo se basa en los
El balanceo se basa en el FE colores de los nodos
Skip List
Modificación de una "lista enlazada”, para el mejoramiento en
la eficiencia de la operación de búsqueda de datos
almacenados ordenadamente en esta estructura.
Cada nodo puede tener uno o varios enlaces al nodo
siguiente y a diversos nodos a distancias variables, bien
establecidas de forma aleatoria o siguiendo un patrón
establecido de saltos a longitudes fijas.
Skip List
Lista enlazada con cabecera (ordenada)
3 10 13 16 18 25 29 32 34 38
3 10 13 16 18 25 29 32 34 38
3 10 13 16 18 25 29 32 34 38
Skip List
Caso Límite:
Cada nodo múltiplo de 2i referencia al nodo que está 2i
lugares por delante de él ( i ≥ 0). “lista skip perfecta” en la
cual sucederá una búsqueda binaria: O(log2n).
3 10 13 16 18 25 29 32 34 38
Skip List
Se define un nodo de nivel k como aquel nodo que
posee k referencias.
La mitad de los nodos son de nivel 1, un cuarto de los
nodos son de nivel 2, etc.
En general, aproximadamente n/2i nodos son de nivel i.
Skip List - búsqueda
Empezar en la referencia de más alto nivel.
Continuar en el mismo nivel hasta encontrar un nodo cuya
clave sea mayor al elemento a buscar, o sea NULL:
Descender un nivel y continuar de la misma manera
Cuando el avance se detiene en el nivel inferior, se ha
encontrado la clave o ésta no existe.
P.e. buscar 29
Skip List - búsqueda
Empezar en la referencia de más alto nivel.
Continuar en el mismo nivel hasta encontrar un nodo cuya
clave sea mayor al elemento a buscar, o sea NULL:
Descender un nivel y continuar de la misma manera
Cuando el avance se detiene en el nivel inferior, se ha
encontrado la clave o ésta no existe.
P.e. buscar 29
Skip List - búsqueda