Laboratorio de Estructuras de Datos II

Documentos relacionados
Estructuras de Datos II

Estructura de Datos Tema 6. Árboles. Contenido 14/06/2018

Estructura de Datos Unidad 6: ARBOLES

Árboles. Árboles. Árboles binarios de búsqueda. Árboles. Inserción en un árbol. Árbol binario de búsqueda

Árboles B y B ) 20. Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 63

PROGRAMA EDUCATIVO INFORMATICA ADMINISTRATIVA

Tema 10: Árbol binario de búsqueda

Estructuras de Datos Clase 20 Árboles de búsqueda

Programación 2 Práctico 9 - TADs Árbol Binario de Búsqueda, Árbol Finitario y Árbol n-ario

UNIVERSIDAD AUTONOMA DEL ESTADO DE MEXICO CENTRO UNIVERSITARIO UAEM ATLACOMULCO ESTRUCTURAS DE DATOS ING. GREGORIO GARCIA ESTRADA INTEGRANTES:

Eduardo Mosqueira Rey Bertha Guijarro Berdiñas Mariano Cabrero Canosa

Análisis y Complejidad de Algoritmos. Arboles Binarios. Arturo Díaz Pérez

A) PREORDEN B) INORDEN C) POSTORDEN D) NIVELES

Estructura de Datos. Temario Unidad VI. Árboles Árboles Binarios

Árboles Binarios Ordenados Árboles AVL

UNIVERSIDAD AUTONOMA DE MADRID ESCUELA POLITÉCNICA SUPERIOR ESTRUCTURAS DE DATOS Y ALGORITMOS

Capítulo 8. Árboles. Continuar

Árboles RN Montículos

Segundo parcial de Programación 2

Estructura de datos y de la información Boletín de problemas - Tema 10

PRÁCTICA No. 9 RECORRIDOS EN ÁRBOLES BINARIOS

4.1 Concepto de árbol.

Francisco J. Hernández López

Estructuras de Datos. Clase 20 Árboles de búsqueda. Dr. Sergio A. Gómez.

Programación II Árboles binarios de búsqueda (ABB)

Estructura de Datos. Árboles Binarios de Búsqueda ABB. Primer Semestre, 2010

TEMA 3. Árboles. Objetivos. Contenidos. Bibliografía. Básica

3.6. Árboles B DEFINICIONES

Estructura de Datos. Unidad V Estructuras no lineales estáticas y dinámicas. (Árboles y grafos)

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

Estructura de Datos. Índice

12/08/2017 AVL. Especificación sobre árboles AVL. AVL: rotaciones

Estructura de Datos. Listas Enlazadas

Guía práctica de estudio 4 Algoritmos de búsqueda parte 1

Tema 09: TAD Árbol binario

Estructuras Dinámicas de datos.

Estructura de Datos. Temario Unidad VI. Árboles Árboles AVL

Outline Desbalance Árboles Red-Black Rotaciones Inserción en Arboles Red-Black. Roberto Carlos Abreu Díaz. November 5, 2009

Estructuras dinámicas lineales (i)

ESTRUCTURAS DE DATOS Y ALGORITMOS

Porque usar Arreglos?

2. Con una lista ordenada, aunque la localización y eliminación es rápida el problema es en la inserción de datos pues puede ser del orden de O(n).

localizar de un dato con un acceso directo y en una sola comparación de la llave. HASH

Árboles n-arios de búsqueda. Lección 16

En las preguntas 1-30 indique la respuesta correcta. e= ninguna de las anteriores

Tema Árboles generales. 9.2 Árboles binarios 9.3 Árboles de búsqueda

Estructura de datos y algoritmos. Tema V TDA DINÁMICOS NO LINEALES: Árboles: árboles binarios

Tema 8. Listas. José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz

Archivos Indice. Indexación y. Asociación. Conceptos Básicos Indices Ordenados Arboles. Asociación. Docente: Albert A.

Clase adicional 9. Listas enlazadas. Temas. Listas enlazadas Árboles Problemas de la clase adicional Ejercicios de diseño

Listas Posicionales. Listas posicionales

El método main de la clase PruebaArbol, empieza creando una instancia de un objeto Árbol vacío y asigna su referencia a la variable árbol

Francisco J. Hernández López

Diseño y Análisis de Algoritmos con Java(I Sem. 2004) Prof. Dr.Eric Jeltsch F.

Estructuras dinámicas lineales (ii)

1. Leer el primer número y almacenarlo en la raíz del árbol. 2. Repetir hasta encontrar un duplicado o el árbol esté vacío.

Ejercicios del Tema 3 Estructuras jerárquicas: Árboles

Tema 4. Estructuras no lineales de datos: árboles

1.2.4 Listas enlazadas

Árboles de Partición Quadtrees Octrees K-d trees

Estructuras de datos: Árboles binarios de

Implementación de diccionarios sobre Trie en C++

Tipos Recursivos de Datos

Colas deprioridad y heaps

Tema 08: TAD Árbol. M. en C. Edgardo Adrián Franco Martínez edgardoadrianfrancom

Guía práctica de estudio 08: Estructuras de datos lineales: Lista doblemente ligada y doblemente ligada circular.

SOLUCIÓN EJERCICIOS DE UTILIZACIÓN DE TIPOS ABSTRACTOS DE DATOS

EXAMEN EXTRAORDINARIO Informática y Computación IV

Introducción a los árboles. Lección 11

Examen de Estructuras de Datos y Algoritmos (Ingeniería Informática)

ARBOLES B. Lo que si es cierto es que la letra B no significa "binario", ya que:

Francisco J. Hernández López

Existen varios tipos de árboles: 5.1 Árboles binarios

ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Contenido PARTE II: ESTRUCTURAS DE DATOS AVANZADAS

Métodos de Ordenamiento. Unidad VI: Estructura de datos

Indexación y Asociación

Estructuras de datos utilizando JAVA

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

Tema 6: Estructuras de datos recursivas

Estructuras de Datos

Estructura de datos Colas

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO

Definición de árbol. Árboles

Estructura de Datos Árboles Árboles 2-3

Programación II Arboles Binarios(AB)

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

Estructuras de Datos Clase 14 Árboles binarios de búsqueda

Árboles de Partición Quadtrees Octrees K-d trees

Ejercicio 2 Considere la representación para Lista de Naturales y Árbol Binario de Naturales de la Figura 1.

Algoritmos y Programación II Curso 2006

Estructura de Datos. Estructuras de Datos no lineales : Árboles

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

ÍNDICE 1. Índice Listas ordenadas Operaciones permitidas Pilas Operaciones permitidas...

Guía práctica de estudio 07. Estructuras de datos lineales: Lista simple y lista circular.

Instituto de Computación. Facultad de Ingeniería. Universidad de la República Examen de Programación 2 03 de Agosto de 2006 Generalidades:

Transcripción:

Laboratorio de Estructuras de Datos II Segundo examen parcial Fecha límite de entrega: Jueves 19 de noviembre de 2009, 3:59:59 p.m. Los árboles B son estructuras de datos jerárquicas que se utilizan para almacenar y manipular datos ordenados de forma muy eficiente, ya que por su estructura y sus propiedades las inserciones y las eliminaciones se realizan en un tiempo logarítmico amortizado. Por esta razón, se utilizan para crear índices dentro de las bases de datos relacionales, para agilizar la búsqueda de registros. Un nodo de un árbol B de orden n puede tener (n) hijos, por lo cual contendrá n-1 datos. Por ejemplo, un árbol B de orden 4 tiene la siguiente estructura: 5 9 15 2 3 4 7 8 12 14 25 35 En esta estructura (para el ejemplo un árbol de enteros, de orden 4), se debe garantizar que: Los datos dentro de cada nodo se encuentran ordenados de forma ascendente. Todos los datos de los hijos almacenados a la izquierda de cualquier dato deben ser menores que él y todos los datos de los hijos almacenados a la derecha de cualquier dato deben ser mayores que él. Todas las hojas del árbol se encuentran en el mismo nivel Inserción en un árbol B El proceso de insertar un valor en un árbol B se realiza siempre en los nodos hoja, de la siguiente forma: Si el árbol está vacío, se debe crear un nuevo nodo B e insertar el nuevo valor. Este nodo se convierte en la raíz del árbol. Si el árbol no está vacío, primero se deberá verificar que el nuevo dato no exista dentro del árbol. Para ello se deberá realizar una búsqueda empezando desde la raíz. Si el nuevo dato no existe, el proceso de búsqueda deberá hallar el nodo hoja (B) en el cual se va a insertar el nuevo nodo. Una vez encontrado el nodo hoja (B) en el cual se almacenará el nuevo dato se pueden presentar dos casos:

o La hoja (B) tiene espacio para almacenar el nuevo dato. Se debe insertar el dato dentro del nodo B y terminar. o La hoja (B) no tiene espacio: En este caso la hoja se deberá dividir en dos nodos B. Se deberán disponer los valores (que estaban almacenados en la hoja más el nuevo valor) de forma ascendente y se tomará el valor de la mitad (n / 2). Este valor se deberá llevar al nodo B padre (si no existe, se deberá crear uno). El hijo izquierdo del dato que se llevó al padre deberá contener los valores menores que él en la hoja original, y el hijo derecho deberá contener los datos mayores que él en la hoja original. Si al llevar un dato al nodo padre no existe espacio para almacenarlo, se deberá dividir el nodo en dos (como en el paso descrito anteriormente). Implementación de un nodo de árbol B El nodo B se deberá implementar como una lista de nodos binarios, cada uno de los cuales tiene un apuntador izquierdo y derecho a sus nodos B hijos. Tenga en cuenta que los nodos binarios dentro del nodo B comparten el apuntador derecho e izquierdo con sus vecinos. La siguiente gráfica ilustra cómo se debe implementar la estructura de datos para el nodo B (y el nodo binario dentro del nodo B). padre izq der Problema Se deberá implementar un programa que lea comandos desde la entrada estándar para insertar y buscar personas (cada una con codigo, primer nombre, segundo nombre, primer apellido y segundo apellido) en un árbol B que se encuentra inicialmente vacío. El programa deberá terminar cuando encuentre una línea en el archivo con la palabra salir. El criterio de ordenamiento de las personas en el árbol B es su codigo. Cada vez que se busque una persona dentro del árbol se deberá imprimir el número de pasos que se realizaron para encontrarla, comparados con el número de pasos necesarios para buscar la persona en un árbol AVL. Los comandos que se deben implementar son: orden n cargar archivo buscar #codigo Define el orden del árbol B: El máximo número de hijos que puede tener cualquier nodo dentro del árbol. Cargar los datos del árbol B a partir de un archivo llamado archivo Busca la persona cuyo codigo es #codigo dentro del árbol B e

salir imprime el número de pasos que tuvo que realizar para encontrar el valor. En caso que no se encuentre la persona en el árbol también deberá imprimir el número de pasos que realizó. El número de pasos debe incluir la búsqueda dentro de cada nodo B. Para cada caso se deberá imprimir también el número de pasos que se tuvo que realizar para encontrar el valor en un árbol AVL. Termina la ejecución. El formato del archivo que se debe leer con el comando cargar es el siguiente: #El archivo puede contener comentarios o líneas en blanco que deben ser ignorados #Cada línea describe a una persona. Los campos para cada persona están separados #por espacios, y son los siguientes: #codigo primer_nombre segundo_nombre primer_apellido segundo_apellido #Los únicos campos obligatorios para cada persona son el codigo, el #primer nombre y el primer apellido. Los campos faltantes se representan con. 13500710 juan. diaz. 10200340 pedro pablo perez. Salida del programa El programa sólo deberá imprimir cuando reciba un comando buscar. Por ejemplo, para el comando: buscar 13500710 El programa deberá imprimir si la persona existe o no dentro del árbol, el número de comparaciones que se realizaron en el árbol B, y el número de comparaciones que se tendrían que realizar en el árbol AVL.

Anexo: Algoritmos sugeridos para la implementación de los Árboles B /* Insertar. Algoritmo para insertar un elemento en un árbol B. Parámetros: n: Referencia a la raíz del árbol (nodo b) dato: Dato a insertar en el árbol */ insertar(a, dato) baux = a /* Apuntador a la raíz del árbol (nodo b) */ ant = NULL /* Apuntador a la lista enlazada dentro del nodo b*/ nuevobin = crear_nodobin(dato) padre = NULL mientras baux!= NULL /* Sacar el inicio de la lista de datos del nodo b*/ ant = NULL tmp = head(baux->datos) mientras tmp!= NULL and tmp->dato < dato ant = tmp tmp = next(tmp) //Siguiente de la lista! padre = baux //Almacenar el apuntador al padre si tmp!= NULL /* Se puede encontrar en este nodo b */ si dato == tmp->dato /* Existe en este nodo b?*/ retornar //Ya existe el dato! baux = tmp->izq //De lo contrario ir por la izquierda sino /* Se termino la lista de datos, bajar al hijo derecho */ baux = ant->der insertar_nodobin(padre, nuevobin)

fin_algoritmo /* Insertar_nodobin. Algoritmo para insertar un nodo binario en un nodo B. Parámetros: a: Referencia al nodo B en el cual se debe insertar el nodo binario nuevo: Nodo binario a insertar dentro del nodo B */ insertar_nodobin (a, nuevo) si a == NULL //Nueva raiz! raiz = crear_nodob() a = raiz //Se deben actualizar los padres de los nodos B izquierdo y derecho //del nuevo nodo binario si nuevo->izq!= NULL //El nodo binario a insertar trae nodo B izquierdo? nuevo->izq->padre = a si nuevo->der!= NULL //el nodo binario a insertar trae nodo B derecho? nuevo->der->padre = a ant = NULL tmp = head(a->datos) //Buscar el sitio en el cual se debe insertar el nodo dentro del nodo b mientras tmp!= NULL && tmp->dato < nuevo->dato ant = tmp tmp = next(tmp) anterior = NULL siguiente = NULL //ant apunta al nodo anterior, tmp apunta al nodo siguiente //Insertar el nodo después de ant. Si ant es nulo, se inserta al inicio de

//la lista insert_after(a->datos, nuevo) si ant!= NULL anterior = ant si tmp!= NULL siguiente = tmp //Actualizar la referencia derecha del nodo binario anterior si anterior!= NULL anterior->der = nuevo->izq; //Actualizar la referencia izquierda del nodo binario siguiente si siguiente!= NULL siguiente->izq = nuevo->der balancear(a) fin_algoritmo

/* Balancear. Algoritmo para balancear un nodo B Parametros: a: Referencia al nodo B a balancear */ balancear(a) aux = a //Mientras el nodo este desbalanceado, balancear mientras aux!= NULL y aux->datos->count == ORDEN ant=null it = head(aux->datos) //Hallar el nodo binario de la mitad dentro del nodo B para i desde 0 hasta ORDEN / 2 ant=it it=next(it); fin_para //it queda apuntando al nodo de la lista que se debe subir //Sacar la referencia al nodo binario que se debe subir al padre n = it //Crear el nuevo nodo B que contiene lo datos n/2 + 1... n del nodo B actual nuevob = crear_nodob() nuevob->padre = aux->padre //El padre de nuevob es el mismo que aux //El nodo binario que se sube al padre tiene como //hijo izquierdo al nodo B original y como //hijo derecho el nuevo nodo B n->izq = aux n->der = nuevob //Avanzar al siguiente nodo binario: //Estos nodos binarios se deben insertar en el nuevo nodob it = next(it)

mientras it!=null tmp = it //Actualizar el padre de los nodos B hijos del nuevo nodo B si tmp->izq!= NULL tmp->izq->padre = nuevob si it->next == NULL) //Ultimo nodo? //actualizar la referencia derecha si tmp->der!= NULL tmp->der->padre = nuevob //Insertar el nodo binario en el nuevo nodo B insertar_nodobin(nuevob, tmp) //avanzar al siguiente nodo binario it=next(it) //Ahora borrar los nodos sobrantes del nodo B original mientras tail(aux->datos)!= ant pop_back(aux->datos) //Ahora llevar el nodo binario al nodo B padre! insertar_nodobin(aux->padre, n) //Iterar con el padre, para verificar si quedo balanceado aux = aux->padre fin_algoritmo

/* Buscar. Algoritmo para buscar un elemento en un arbol B. Parametros: a : Referencia a la raiz del arbol (nodo b) dato: Dato a buscar en el arbol */ buscar(a, dato) baux = a /* Apuntador a la raiz del arbol (nodo b) */ ant = NULL /* Apuntador a la lista enlazada dentro del nodo b*/ encontrado=false mientras baux!= NULL and encontrado == FALSE /* Sacar el inicio de la lista de datos del nodo b*/ ant = NULL tmp = head(baux->datos) /* Comparar el dato con el primero de la lista */ si dato == tmp->dato encontrado=true sino si dato < tmp->dato /* Bajar al hijo izquierdo */ baux = tmp->izq sino /* Recorrer la lista de datos */ ant = NULL mientras tmp!= NULL and tmp->dato < dato ant = tmp tmp = next(tmp) //Siguiente de la lista! si tmp!= NULL /* Se puede encontrar en este nodo b */ si dato == tmp->dato /* Existe en este nodo b?*/ encontrado=true sino baux = tmp->izq sino /* Se termino la lista de datos, bajar al hijo derecho */

si dato > ant->dato baux = ant->der retornar encontrado fin_algoritmo