Cont. Arbol Binario de Búsqueda (2). Sobre los recorridos Las versiones recursivas de los recorridos son costosas debido a la gran cantidad de llamadas.

Slides:



Advertisements
Presentaciones similares
5. Estructuras no lineales estáticas y dinámicas
Advertisements

INTELIGENCIA ARTIFICIAL
IBD Clase 7.
ESTRUCTURA DE DATOS Unidad 04 Árboles BINARIOS.
ESTRUCTURA DE DATOS Unidad 04 Árboles BINARIOS DE BUSQUEDA.
ÁRBOLES EN C UNIVERSIDAD “ALONSO DE OJEDA” Facultad de Ingeniería
Programación y Estructuras de Datos
ÁRBOLES BINARIOS DE BUSQUEDA
Operaciones sobre un árbol
Tema 4 Árboles. Conceptos Generales..
PROGRAMACION DE Pilas o Stacks y Colas
ESTRUCTURAS DE DATOS AVANZADAS
Algoritmos Aleatorizados
Solución de problemas por búsqueda inteligente
Cont. Arbol Binario de Búsqueda
Árboles balanceados AVL
ÁRBOLES DE EXPRESION.
Almacenamiento y Recuperacion de Información TAD_ABB Ana Lilia Laureano Cruces Universidad Autónoma Metroplotiana.
Tema Nº4.
Tema 9 Estructuras.
Estructura de Datos Lineales
ÁRBOLES BINARIOS DE BÚSQUEDA
C++ LISTAS C++ 11/04/2017 Ing. Edgar Ruiz Lizama.
Estructuras de Datos MC Beatriz Beltrán Martínez.
Árboles, montículos y grafos Cola de prioridades, montículos
Tópicos I Árboles, montículos y grafos
PILAS, COLAS, RECURSIVIDAD.
ESTRUCTURAS DE DATOS I Conocer, comprender y analizar algunos de los principales tipos de estructuras de datos.
ARBOLES ESTRUCTURAS DE DATOS.
7.  El TDA Diccionario.
Estructura de Datos y Algoritmos
Clase 10: Estructuras de datos y arreglos.
Arboles M.C. José Andrés Vázquez FCC/BUAP
ARBOLES ESTRUCTURAS DE DATOS.
Almacenamiento y Recuperacion de Información- Arbol AVL
ÁRBOLES BINARIOS DE BÚSQUEDA BALANCEADOS
Estructuras de Datos1 ABB´s balanceados por peso Balance perfecto Para cada nodo, el número de nodos del subárbol izquierdo y el número de nodos del subárbol.
Árboles.

Árboles AVL cont..
Árboles Recomendado: 1. Nivelación Funciones
Árboles Binarios Estructuras de Datos.
Árboles de Búsqueda Binaria
Con el objeto de mejorar el rendimiento en la búsqueda surgen los árboles balanceados. La idea central de estos es la de realizar reacomodó o balanceos.
1 Arboles AVL Introducción Arboles AVL (Adel’son-Vel’skii and Landis.
Arboles binarios de búsqueda. Elemento estándar: Cuenta class Cuenta { public: int codigo; char nombreCliente[50]; float saldo; public: Cuenta(); Cuenta(int.
Estructura de Datos M.C. José Andrés Vázquez Flores FCC/BUAP
Ordenación El ordenamiento por inserción (insertion sort en inglés) es una manera muy natural de ordenar para un ser humano, y puede usarse fácilmente.
Unidad 6: Árboles.
Estructura de Datos M.C. J. Andrés V. F. FCC/BUAP
1 Árboles de Búsqueda Binaria Agustín J. González ELO-320: Estructura de Datos y Algoritmos.
Punteros, referencias Listas enlazadas Arboles
Algoritmos y estructura de datos en I.O.
Árboles Binarios de Búsqueda (ABB)
Arboles Binarios.
A YUDANTÍA 5: A RBOLES Carlos Pulgar R. Mail: Página Ayudantía:
Árboles Binarios * Recorridos * Tipo
PROGRAMACION DE Pilas o Stacks
Árboles Equilibrados Estructuras de Datos MC Beatriz Beltrán Martínez Primavera 2015.
Laboratorio de programación
Matemáticas Discretas MISTI
PROGRAMACION DE Pilas o Stacks y Colas
M.C. Meliza Contreras González
Arboles Binarios: AVL (Adelson – Velskii - Landis)
1 ListaUna Lista se define como una serie de N elementos E 1, E 2,..., E N, ordenados de manera consecutiva, es decir, el elemento E k (que se denomina.
Clase II Estructuras dinámicas (TAD) Listas Enlazadas. ¿A que llamamos estructuras dinámicas? ¿Por qué son necesarias? Ventajas y Desventajas que tendremos.
Bases de datos II Universidad del Cauca Ing. Wilson Ortega.
UNIDAD ACADÉMICA PROFESIONAL TIANGUISTENCO LICENCIATURA EN INGENIERÍA DE SOFTWARE UNIDAD DE APRENDIZAJE: ESTRUCTURAS DE DATOS Créditos institucionales.
ÁRBOLES ESTRUCTURA DE DATOS II ING. CARLOS ALBERTO PULLAS.
Estructura de Datos M.C. J. Andrés V. F. FCC/BUAP
Transcripción de la presentación:

Cont. Arbol Binario de Búsqueda (2)

Sobre los recorridos Las versiones recursivas de los recorridos son costosas debido a la gran cantidad de llamadas recursivas que pueden llegar a copar la pila (stack) Se prefieren entonces versiones no recursivas para dichos recorridos

Las versiones no recursivas de estos recorridos requieren el uso de un arreglo (o lista) auxiliar de apuntadores a los nodos Su codificación es menos clara que sus versiones recursivas Se verá la versión no recursiva de inorden

Implementación Se agrega a la clase ArbolBin la siguiente declaración: void inorden_nr(Nodo *r); Inorden No Recursivo

void ArbolBin::inorden_nr(Nodo *r) { Nodo *vec[100]; // Vector de punteros a Nodos int j=0; //Se insertan en el vector de punteros de nodos //los que están en la "rama" izquierda de la raíz while(r != NULL) { j++; vec[j] = r; r= r ->hijoIzq; }

/* Se saca el último puntero insertado en el vector, imprimimos y nos pasamos a su hijo derecho para realizar el mismo proceso hecho a la raíz */ while(j>0){ r = vec[j]; j--; cout dato).codigo << endl; r = r->hijoDer; while(r != NULL) { j++; vec[j] = r; r= r ->hijoIzq; }

Son árboles binarios balanceados por altura Sus inventores fueron G. Adelson-Velskii y E. Landis Concebidos especialmente para ser aplicados en los árboles binarios de búsqueda Evitan que los árboles se “degeneren” (sesgados a derecha o izquierda) Árboles AVL

Su implementación es más compleja que un árbol binario simple Las operaciones de búsqueda, inserción y borrado mantienen un buen tiempo de desempeño O(Log n) rotacionesPara comprender el algoritmo de inserción en AVL se requiere entender primero que son las rotaciones

La operación de borrado es bastante compleja Se han propuesto variantes y mejoras a los árboles AVL: Árboles rojinegros, Árboles Splay, AA-Árboles Se verá a continuación las rotaciones y luego el algoritmo de inserción

Factor de Balance: Concepto clave en los árboles AVL El factor de balance para cualquier nodo x del árbol se define como la diferencia entre la altura del subárbol izquierdo de x y la altura del subárbol derecho de x. Es decir: FB(x) = Altura(subárbol Izq. de x) – Altura(subárbol Der. de x) Un árbol binario H es AVL si: │FB (x)│ < 2,  x  H

Operaciones de rebalanceo: inordenConsiste en reacomodar los registros de un árbol binario de tal forma que los factores de balance de todos los nodos sean -1, 0, ó 1 y que el recorrido inorden sea el mismo que antes del reacomodo. Estas operaciones se conocen como rotaciones

Operaciones de Rebalanceo: 1. Rotación a la derecha 2. Rotación a la izquierda 3. Doble rotación a la derecha 4. Doble rotación a la izquierda

Para explicar lo referente a las rotaciones se asume la siguiente convención: Sea P el puntero al nodo con factor de balance no permitido (+2 ó -2) Sea Q el puntero al hijo izquierdo o al hijo derecho de P, dependiendo de si FB(P)=+2 ó FB(P)= -2

Rotación a la Derecha Se efectúa cuando: FB (P) = + 2 FB (Q) = + 1 Consiste en girar, en sentido de las manecillas del reloj, el registro P alrededor del registro Q.

Consecuencias: P pasará a ser el nuevo hijo derecho de Q El anterior hijo derecho de Q será el nuevo hijo izquierdo de P Q será la nueva raíz del árbol balanceado Los nuevos factores de balance de P y Q serán cero (0) La altura del árbol balanceado disminuye en uno (1)

Antes Después Nótese que los recorridos INORDEN sobre ambos árboles es el mismo

Pseudo Código de la operación: Rotacion_a_la_Derecha(P, Q) P -> hijoIzq = Q -> hijoDer Q -> hijoDer = P P -> FB = 0 Q -> FB = 0 FIN Luego se verá la codificación en C++ en el algoritmo completo de inserción

Rotación a la Izquierda Se efectúa cuando: FB (P) = - 2 FB (Q) = - 1 Consiste en girar, en sentido contrario de las manecillas del reloj, P alrededor de Q.

Consecuencias: P será el nuevo hijo izquierdo de Q El nuevo hijo derecho de P será el anterior hijo izquierdo Q Q será la nueva raíz del árbol balanceado Los factores de balance P y Q quedarán en cero La altura del árbol balanceado disminuye en uno (1)

Antes Después Nótese que los recorridos INORDEN sobre ambos árboles es el mismo

Pseudo Código de la operación: Rotacion_a_la_Izquierda(P, Q) P -> hijoDer = Q -> hijoIzq Q -> hijoIzq = P P -> FB = 0 Q -> FB = 0 FIN Luego se verá la codificación en C++ en el algoritmo completo de inserción

Las últimas 2 rotaciones se denominan dobles Para definirlas se adopta la siguiente convención: Sea R el registro que representa el hijo izquierdo o el hijo derecho de Q dependiendo de si el factor de balance de Q es +1 ó -1.

Doble Rotación a la Derecha Se efectúa cuando: FB (P) = + 2 FB (Q) = - 1 Consiste en: Una rotación a la izquierda de Q alrededor de R seguida de una rotación a la derecha de P alrededor de R

Consecuencias: R será la nueva raíz del árbol balanceado P será el nuevo hijo derecho de R Q será el nuevo hijo izquierdo de R El anterior hijo derecho de R será el nuevo hijo izquierdo de P El anterior hijo izquierdo de R será el nuevo hijo derecho de Q La altura del árbol balanceado disminuye en uno (1) El factor de balance de R será cero Los factores de balance de P y Q tomarán nuevos valores, los cuales dependerán del factor de balance inicial del registro R el cual puede ser -1, 0 ó 1

Antes Después Nótese que los recorridos INORDEN sobre ambos árboles es el mismo

En el caso anterior el FB del nodo R es 0. Para este caso los FB finales de los nodos P y Q serán cero. Si FB inicial de R es cero entonces: FB(P) = 0 y FB(Q) = 0 Veamos los otros casos:

Antes Después

En conclusión si FB inicial de R es 1 entonces FB(P) = -1 y FB(Q) = 0 De manera similar se puede comprobar que si FB inicial de R es -1entonces FB(P) = 0 y FB(Q) = 1

Pseudo Código de la operación: Doble_Rotacion_a_la_Derecha(P, Q) R = Q -> hijoDer //Se obtiene R a partir de Q factor_R = R->FB //Se guarda el factor de balance de R Rotacion_a_la_Izquierda(Q, R) Rotacion_a_la_Derecha(P, R) Caso de factor_R :0: P -> FB = 0 Q -> FB = 0 :1: P -> FB = -1 Q -> FB = 0 :-1: P -> FB = 0 Q -> FB = 1 FIN(Caso) R -> FB = 0 Q = R //Se deja la raíz en Q FIN Luego se verá la codificación en C++ en el algoritmo completo de inserción

Doble Rotación a la Izquierda Se efectúa cuando: FB (P) = - 2 FB (Q) = +1 Consiste en: Una rotación a la derecha de Q alrededor de R seguida de una rotación a la izquierda de P alrededor de R.

Consecuencias: R será la nueva raíz del árbol balanceado P será el nuevo hijo izquierdo de R Q será el nuevo hijo derecho de R El anterior hijo derecho de R será el nuevo hijo izquierdo de Q El anterior hijo izquierdo de R será el nuevo hijo derecho de P La altura del árbol balanceado disminuye en uno (1) El FB de R será cero Los factores de balance de P y Q tomarán nuevos valores, los cuales dependerán del factor de balance inicial del registro R el cual puede ser -1, 0 ó 1

Antes Después Nótese que los recorridos INORDEN sobre ambos árboles es el mismo

En el caso anterior el FB del nodo R es 0. Para este caso los FB finales de los nodos P y Q serán cero. Si FB inicial de R es cero entonces: FB(P) = 0 y FB(Q) = 0 Veamos los otros casos:

Antes Después

En conclusión si FB inicial de R es 1 entonces FB(P) = 0 y FB(Q) = -1 De manera similar se puede comprobar que si FB inicial de R es -1entonces FB(P) = 1 y FB(Q) = 0

Pseudo Código de la operación: Doble_Rotacion_a_la_Izquierda(P, Q) R = Q -> hijoIzq //Se obtiene R a partir de Q factor_R = R->FB//Se guarda el factor de balance de R Rotacion_a_la_Derecha(Q, R) Rotacion_a_la_Izquierda(P, R) Caso de factor_R :0: P -> FB = 0 Q -> FB = 0 :1: P -> FB = 0 Q -> FB = -1 :-1: P -> FB = 1 Q -> FB = 0 FIN(Caso) R -> FB = 0 Q = R // Se deja la raíz en Q FIN Luego se verá la codificación en C++ en el algoritmo completo de inserción