Estructura de Datos Árboles AVL

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