ARBOLES PARCIALMENTE ORDENADOS ESTRUCTURAS DE DATOS.

Slides:



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

Definición Las colas ofrecen dos operaciones fundamentales, que son encolar (al final de la cola) y desencolar (del comienzo de la cola). Al igual que.
IBD Clase 7.
ESTRUCTURA DE DATOS Unidad 04 Árboles BINARIOS.
ESTRUCTURA DE DATOS Unidad 04 Árboles BINARIOS DE BUSQUEDA.
Árboles Grafo que no contiene ciclos, es decir es un grafo también acíclico, pero a su vez es conexo.
Pilas y Colas Fundamentos Estructuras de Datos (Programación 2)
GRAFOS ESTRUCTURAS DE DATOS.
Montículos Daniel González Pérez Cristina Sánchez Aragón
ÁRBOLES EN C UNIVERSIDAD “ALONSO DE OJEDA” Facultad de Ingeniería
TDA LISTA ESTRUCTURAS DE DATOS.
1 Extensión de un Estructura de Datos Agustín J. González ELO-320: Estructura de Datos y Algoritmos.
Programación y Estructuras de Datos
ORDENACION POR EL METODO DE LA SACUDIDA (SHAKER SORT)
ÁRBOLES BINARIOS DE BUSQUEDA
Operaciones sobre un árbol
Árboles binarios. Algoritmos básicos
Tema 5 Grafos. Recorridos..
ESTRUCTURAS DE DATOS AVANZADAS
PROGRAMACION DE ESTRUCTURAS DE DATOS
Cont. Arbol Binario de Búsqueda
Árboles balanceados AVL
Programación II Colas Igor Santos Grueiro.
Oscar Bedoya. Edificio 331, 2º piso, E.I.S.C. Estructuras de datos y algoritmos.
Genericidad Los datos de aplicaciones muy diferentes puede modelarse con frecuencia a partir de tipos de datos cuyas operaciones no dependen del tipo de.
ÁRBOLES DE EXPRESION.
Slide 7-1 Copyright © 2003 Pearson Education, Inc. Figure: Estructuras de datos.
Almacenamiento y Recuperacion de Información TAD_ABB Ana Lilia Laureano Cruces Universidad Autónoma Metroplotiana.
Estructuras dinámicas de datos, TAD Lista, parte 2
COLAS, IMPLEMENTACIÓN A PARTIR DE LISTAS Y PARA PILAS
APLICACIONES DE PILAS Estructuras de Datos.
Igor Santos Grueiro. De este tipo de pilas NO vamos a hablar.
Arboles Binarios de expresiones
Ana Lilia Laureano Cruces UAM-A
Tema 9 Estructuras.
1 Algoritmos Elementales de Grafos Agustín J. González ELO-320: Estructura de Datos Y Algoritmos 1er.Sem
ÁRBOLES BINARIOS DE BÚSQUEDA
C++ LISTAS C++ 11/04/2017 Ing. Edgar Ruiz Lizama.
Árboles, montículos y grafos Cola de prioridades, montículos
Ordenamiento, Heapsort y Colas de prioridad
Heaps Mauro Maldonado Abril/2005. Introducción La estructura heap es frecuentemente usada para implementar colas de prioridad. En este tipo de colas,
ARBOLES ESTRUCTURAS DE DATOS.
7.  El TDA Diccionario.
Estructura de Datos y Algoritmos
Diseño y análisis de algoritmos
Árboles binarios de búsqueda
Arboles M.C. José Andrés Vázquez FCC/BUAP
ARBOLES ESTRUCTURAS DE DATOS.
Árboles B M.C. José Andrés Vázquez Flores Estructuras de Datos / Primavera 2014.
1 Estructuras de Datos Elementales:stacks (pilas), queues (colas), linked lists (listas enlazadas), y rooted trees (árboles con raíz) Agustín J. González.
AED3: Algoritmos y Estructuras de Datos 3.  Uno de los conceptos mas utiles en computacion es la pila o stack  Es un conjunto de elementos, en la que:
Pilas y Colas Estructuras de Datos.
TDA PILA ESTRUCTURAS DE DATOS.
Árboles Recomendado: 1. Nivelación Funciones
Árboles Binarios Estructuras de Datos.
clase 23: Stacks y Queues Problema.
Árboles de Búsqueda Binaria
1 Ordenamiento y estadísticas de orden Agustín J. González ELO 320: Estructura de Datos y Algoritmos.
TIPOS ABSTRACTOS DE DATOS. 2  Un Tipo Abstracto de Dato (TAD) es un modelo constituido por un conjunto de objetos y una colección de operaciones realizables.
Unidad 6: Árboles.
Punteros, referencias Listas enlazadas Arboles
Estructuras de datos Fundamentos de análisis y diseño de algoritmos.
Ayudantia 3: Pilas- Colas
A YUDANTÍA 5: A RBOLES Carlos Pulgar R. Mail: Página Ayudantía:
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
Árboles Equilibrados Estructuras de Datos MC Beatriz Beltrán Martínez Primavera 2015.

PILAS Una pila es una estructura de datos o lista de elementos, a la cual se le puede insertar o eliminar su contenido sólo por uno de sus extremos, llamado.
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.
UNIVERSIDAD DIEGO PORTALES Facultad de Ingeniería Programación Avanzada TIPOS ABSTRACTOS DE DATOS TAD Tema: TIPOS ABSTRACTOS DE DATOS TAD Subtema: COLAS.
Transcripción de la presentación:

ARBOLES PARCIALMENTE ORDENADOS ESTRUCTURAS DE DATOS

CONCEPTOS Arbol Parcialmente Ordenado Es Binario Completo Con propiedad de orden Entre raiz e hijos, la raiz contiene el mayor(o menor) de todos Arbol Binario Completo Todos sus niveles estan completos A excepción del ultimo nivel, Alli las hojas van apareciendo seguidas de izquierda a derecha

UTILIDAD DE UN HEAP Si el mayor valor esta siempre en la raiz El heap presenta un cierto orden Al remover consecutivamente la raiz Vamos consiguiendo valores ordenados El heap se utiliza Para el ordenamiento de elementos(HeapSort) ‏ Para implementar colas de prioridad QDesencolarMax, es retirar el valor de la raiz

IMPLEMENTACION Un heap no admite “huecos”, C/nivel se va llenando de izq. A der Hay una secuencia Podriamos numerar c/nodo En el orden de llenado Si lo vemos asi, dado un índice Podemos conocer los indices de los hijos y el padre de un nodo Ejemplo: Del nodo 4, hijos 8 y 9, padre 2 i*2 i*2+1 i/2

CONTANDO DESDE 0 Queremos usar un vector En c/elemento almacenar la información Dirigirnos a hijos y padre calculando el índice respectivo Izq(i) = i*2 Der(i) = i*2+1 Padre(i) = i/2 Los vectores en C, empiezan desde 0 Cambia un poquito la regla Izq(i) = (i+1)*2-1 = i*2+1 Der(i) = (i+1)*2 = i*2+2 Padre(i) = (i+1)/2-1 = (i-1)/

REGLAS Vector V de tamaño efectivo n V[0] es la raiz Dado un nodo V[i] Si 2i+1 < n, V[2i+1] es el hijo izq Si 2i+2 < n, V[2i+2] es el hijo der Si i != 0, v[(i-1)/2] es el padre Si es heap

DECLARACION: TDA HEAP Tipo de Dato Necesitamos un arreglo Llevar el tamaño efectivo Llevar el máximo del arreglo typedef struct{ Generico *Elementos; int nefectivo; int max; Tipo_Orden tipo; }Heap;

OPERACIONES BASICAS: TDA HEAP Desencolar y Encolar Desencolar: Extraer el elemento mas grande/pequeño del heap(la raiz) ‏ Encolar: Insertar un valor al heap y ubicarlo en la posicion correcta HeapSort Dado un Heap permite generar un arreglo/lista ordenado Operaciones Adicionales Ajustar Reestablece la propiedad de orden de un subheap hacia abajo No a todo el arbol! Construir_heap Dado un arreglo que no representa un heap Arregla el arreglo y lo convierte en un Heap

MAS OPERACIONES int PosIzq(Heap H, int i); Retorna el indice del nodo izq de i Si no cumple las reglas, retorna -1 int PosDer(Heap H, int i); Retorna el índice del nodo der de i Si no cumple las reglas, retorna -1 int PosPadre(Heap H, int i); Retorna el índice del nodo padre de i Si no cumple las reglas, retorna -1 Heap * Heap_Crear(int tmax, TipoOrden t); Recibe un heap y lo inicializa para tener un tamaño maximo tmax y un orden t(ascendente o descendente) ‏ bool EstaVacio(Heap P); Recibe un Heap y determina si esta Vacio

AJUSTAR Recobra la propiedad de orden Desde un nodo de índice pos Dado un índice pos, PosIzq y PosDer Se compararan los tres para ver quien tiene el mayor Si el mayor lo tiene algun hijo Intercambia Al hacer esto, el sub-heap afectado puede perder su propiedad de Orden…. Ajustar el sub-heap afectado

AJUSTAR: EJEMPLO Un heap puede perder su p.o. Por un nodo Pos PosMayor 8060 Ejemplo: En el nodo 1 no se cumple Ajustar El mayor es el nodo 3 Intercambiar Ajustar desde nodo intercambiado(3) ‏ Ejemplo: En el nodo 3 no se cumple Ajustar El mayor es el nodo 3 Intercambiar Ajustar Otra Vez Pos 70 PosMayor 7060 Ejemplo: No se puede ajustar un nodo hoja

AJUSTAR: IMPLEMENTACION static void Heap_Ajustar(Heap *H, int posnodo, Generico_fnComparar comocomparar){ int pos_mayor, izq, der; pos_mayor = posnodo; izq = IdxIzquierdo(*H, posnodo); der = IdxDerecho(*H, posnodo); if(izq>=0 && Heap_CompararxTipo(H->tipo_orden,H->Elementos[izq], H->Elementos[posnodo],comocomparar) )‏ pos_mayor = izq; if(der>=0 && Heap_CompararxTipo(H->tipo_orden,H->Elementos[der], H->Elementos[pos_mayor], comocomparar))‏ pos_mayor = der; if(pos_mayor != posnodo){ Generico_Intercambiar(&(H->Elementos[pos_mayor]), &(H->Elementos[posnodo])); Heap_Ajustar(H,pos_mayor,comocomparar); }

CONSTRUIR UN HEAP La estructura de un heap Puede almacenar un arreglo que no cumpla las propiedades de orden Ejemplo: Hay que arreglar la propiedad de orden De cada raiz Ajustar c/raiz Desde la ultima a la primera

CONSTRUIR HEAP: EJEMPLO Ajustar el ultimo nodo raiz Los nodos raiz comienzan desde 0 hasta n/2-1 Al ajustar cada nodo De atrás hacia delante Nos aseguramos que los valores mas altos suban!

CONSTRUIR HEAP: IMPLEMENTACION void Construir_Heap(Heap *H, Generico_fncomparar comocomparar){ int i; for(i = H->n/2-1; i >= 0; i--){ Heap_Ajustar(H,i,comocomparar); }

DESENCOLAR Que importancia tiene la raiz en el heap? Es el mayor/menor elemento del mismo Sobre el resto de elementos no estamos seguros Pero de la raiz, es la mayor de todos Desencolar es eliminar la raiz Que valor se ubica en la nueva raiz? El ultimo reemplaza al primero El tamaño efectivo del heap cambia Se ajusta desde la raiz El arbol queda bien otra vez

DESENCOLAR: EJEMPLO Intercambiar valores Raiz con ultimo Aminorar tamaño efectivo Ajustar arbol

DESENCOLAR: IMPLEMENTACION Generico Heap_DesEnColar(Heap *H, Generico_fnComparar comocomparar){ Generico gmax; if(!Heap_EstaVacio(*H)){ gmax = H->Elementos[0]; Generico_Intercambiar(&(H->Elementos[0]), &(H->Elementos[H->nefectiva-1])); H->nefectiva --; Heap_Ajustar(H, 0, comocomparar); return gmax; } return NULL; }

HEAPSORT Uno de los usos de los heaps es ordenar Como? Extraer el mayor elemento del heap(raiz) ‏ Ponerla al final de otro arreglo Repetir los dos ultimos pasos hasta que el Heap quede Vacio El arreglo quedara ordenado

HEAPSORT: EJEMPLO Desencolar y ponerlo al final del nuevo arreglo/lista Repetir hasta que el arbol quede vacio

HEAPSORT: IMPLEMENTACION LSE *HeapSort(LSE *Desordenada, Generico_fncomparar comocomparar){ Heap H; LSE_nodo *p; p = LSE_NodoPrimero(Desordenada); while(!LSE_EstaVacia(Desordenada)) { Heap_Encolar(&H,LSE_SacarPrimerNodo(Desordenada),comocomparar) } while(Heap_EstaVacio(H)){ LSE_InsertarInicio(Desordenada, Heap_Desencolar(H, comocomparar); } return Desordenada; }

ENCOLAR Al añadir un nuevo elemento el Heap DEBE conservar su propiedad de orden Se añade al final del arreglo El elemento empieza a subir a su posición ideal Comparando siempre con el padre Hasta que el valor insertado sea menor que el del padre

ENCOLAR: EJEMPLO Insertar al final Subir el valor hasta que ya no sea necesario Nuevo valor:

ENCOLAR: IMPLEMENTACION void Heap_EnColar(Heap *H, Generico G, Generico_fnComparar comocomparar){ int padre, i; if(H->nefectiva max){ H->Elementos[H->nefectiva] = G; H->nefectiva++; i = H->nefectiva-1; padre = IdxPadre(*H,i); while((i>=0 && padre>=0) && Heap_CompararxTipo(H->tipo_orden, H->Elementos[i], H->Elementos[padre], comocomparar)){ Generico_Intercambiar(&(H->Elementos[i]), &(H->Elementos[padre])); i = padre; padre = IdxPadre(*H,i); }