Ordenamiento, Heapsort y Colas de prioridad

Slides:



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

ESTRUCTURA DE DATOS Unidad 04 TDA no lineales - Árboles.
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.
Montículos Daniel González Pérez Cristina Sánchez Aragón
ÁRBOLES EN C UNIVERSIDAD “ALONSO DE OJEDA” Facultad de Ingeniería
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
FORTRAN 90 arreglos.
Cont. Arbol Binario de Búsqueda
Integrantes: Esteban Jiménez Guesseppe Lozada Mario Rodriguez Gustavo Tenorio Fabio.
Definiciones: conjuntos, grafos, y árboles
Evaluación y Optimización de Consultas Láminas seleccionadas de las láminas de la Prof. María Esther Vidal.
ARBOLES PARCIALMENTE ORDENADOS ESTRUCTURAS DE DATOS.
Arboles (Trees) Arboles Arboles binarios Recorridos de árboles
Tema Nº4.
Arboles Binarios de expresiones
Analisis y Diseño de Algoritmos Tema: Grafos 3ra Parte
1 Algoritmos Elementales de Grafos Agustín J. González ELO-320: Estructura de Datos Y Algoritmos 1er.Sem
Árboles.
ÁRBOLES BINARIOS DE BÚSQUEDA
Definiciones: conjuntos, grafos, y árboles
Árboles, montículos y grafos Cola de prioridades, montículos
Tópicos I Árboles, montículos y grafos
Heaps Mauro Maldonado Abril/2005. Introducción La estructura heap es frecuentemente usada para implementar colas de prioridad. En este tipo de colas,
Single-Source Shortest Paths “Camino más corto desde/hacia una fuente”
Estructura de Datos y Algoritmos
Arboles M.C. José Andrés Vázquez FCC/BUAP

ARBOLES ESTRUCTURAS DE DATOS.
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.
1 Algoritmos Avaros (Greedy Algorithms) Agustín J. González ELO-320: Estructura de Datos y Algoritmos.

Árboles Recomendado: 1. Nivelación Funciones
Árboles Binarios Estructuras de Datos.
Agustín J. González ELO320: Estructura de Datos y Algoritmos
1 Algoritmos Avaros (Greedy Algorithms) Agustín J. González ELO-320: Estructura de Datos y Algoritmos 1er. Sem
Árboles de Búsqueda Binaria
Diseño y análisis de algoritmos
Medianas y Estadísticas de Orden
1 Quicksort Agustín J. González ELO320: Estructura de Datos y Algoritmos 1er. Sem
1 Ordenamiento y estadísticas de orden Agustín J. González ELO 320: Estructura de Datos y Algoritmos.
1 Ordenamiento en tiempo lineal y Estadísticas de orden Agustín J. González ELO320: Estructura de Datos y Algoritmos 1er. Sem 2002.
1 Quicksort Agustín J. González ELO320: Estructura de Datos y Algoritmos 1er. Sem
1 Single-Source Shortest Paths “Camino más corto desde/hacia una fuente” Agustín J. González ELO320: Estructura de Datos y Algoritmos 1.er. Sem
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.
Minimum Spanning Tree (Árbol de Expansión Mínima)
Unidad 6: Árboles.
Definiciones: conjuntos, grafos, y árboles
Agustín J. González ELO-320: Estructura de Datos Y Algoritmos
1 Extensión de un Estructura de Datos Agustín J. González ELO-320: Estructura de Datos y Algoritmos.
1 Árboles de Búsqueda Binaria Agustín J. González ELO-320: Estructura de Datos y Algoritmos.
Agustín J. González ELO320: Estructura de Datos y Algoritmos
Minimum Spanning Tree (Árbol de Expansión Mínima)
Análisis de algoritmos Generalidades
Arboles B (búsqueda externa)
Oscar F. Bedoya L. Fundamentos de análisis y diseño de algoritmos.
Heap Fibonacci heap de Fibonacci es una estructura de datos similar a un heap binomial pero con mejor coste amortizado. se utiliza para mejorar el tiempo.
ARBOLES GENERALIZADOS
Arboles Binarios.
A YUDANTÍA 5: A RBOLES Carlos Pulgar R. Mail: Página Ayudantía:
Árboles Binarios * Recorridos * Tipo

M.C. Meliza Contreras González
M.C. Meliza Contreras González
Algoritmos voraces Códigos de Huffman. Descripción del problema Tenemos un archivo de entrada. Asumiremos que el archivo está compuesto de bytes (enteros.
Montículos Binarios (Binary Heaps)
Árboles (Trees) Árboles Árboles binarios Recorridos de árboles
Transcripción de la presentación:

Ordenamiento, Heapsort y Colas de prioridad Agustín J. González ELO 320: Estructura de Datos y Algoritmos

Ordenamiento y Estadísticas de Orden Problema de ordenamiento: Entrada: Una secuencia de n números (a1,a2, ..., an) Salida: Una permutación (a1´, a2´, a3´,...,an´) de la entrada tal que a1´ a2´  a3´ ...  an´ Soluciones: Insertion-Sort, merge-sort, heapsort, quicksort. ---> (n lg n) La estadística de orden i-ésimo de un conjunto de n números, es el i-ésimo número más pequeño. ---> O(n)

Heapsort La estructura de datos “heap” es un arreglo de objetos que pueden ser vistos como un árbol binario completo (sólo pueden faltar nodos al final del último nivel). Ej. 16 14 10 7 9 3 8 1 4 2 1 2 3 4 5 6 7 8 9 10 16 |14 |10 | 8 | 7 | 9 | 3 | 2 | 4 | 1

Propiedades del heap El arreglo puede contener más entradas (=length(A)) que el heap (=heap_size(A)) Obviamente heap_size(A)  length(A) La raíz del árbol es A[1 (Con índices partiendo de 1 aquí) Dado un índice i de un nodo, su padre, hijo izquierdo e hijo derecho son determinados como: Parent(i) return  i/2  Left(i) return 2i Right(i) return 2i+1 Estos procedimientos se pueden implementar como macros o código “in-line”. Propiedad heap : A [Parent(i) A [i para todo nodo diferente de la raíz. 1 2 3 4 5 6 7 8 9 10 16 |14 |10 | 8 | 7 | 9 | 3 | 2 | 4 | 1

Procedimientos básicos usados en algoritmos de ordenamiento y en colas de prioridad Heapify(A,i): Entrada: Left(i) y Right(i) son heaps, pero A[i puede ser menor que sus hijos. Salida: Heapify mueve A[i hacia abajo para que el sub-árbol con raíz i sea un heap. Heapify(A,i) le= Feft(i) ri= Right(i) if( le <= heap_size(A) && A[le > A[i ) largest = le else largest = i if ( ri <= heap_size(A) && A[ri > A[largest ) largest = ri if (largest != i) exchange A[i <-> A[largest Heapify(A, largest)  (1) O (tamaño subárbol)

Análisis de tiempo de Ejecución de Heapify T(n) = (1) + Tiempo de Heapify sobre uno de los sub-árboles. El peor caso para el tamaño del sub-árbol es 2n/3. Éste ocurre cuando la última fila está la mitad llena. 2n/3 n/3 T(n)  T(2n/3) + (1) ==> T(n) = O(lg n)

Construcción del heap: Build_Heap La construcción del heap se logra aplicando la función heapify de manera de cubrir el arreglo desde abajo hacia arriba. Notar que los nodos hojas, ya son heap. Éstos están en A[ (n/2+1) .. n. El procedimiento Build_Heap va a través de los nodos restantes y corre heapify en cada uno. Build_Heap(A) { heap_size [A = length [A for i = length(A) /2  downto 1 do Heapify(A,i) } Ejemplo: 4 | 1 | 3 | 2 | 16 | 9 | 10 | 14 | 8 | 7

Análisis del tiempo de ejecución Cada llamado a Heapify tiene un costo O(lgn) y como a lo más hay n de estos llamados, una cota superior para el costo de Build_heap es O(nlgn). Un mejor análisis conduce a O(n) ¿Cuántos subárboles (nodos) de altura h hay como máximo? Para subárboles (nodos) de altura h el costo de Heapify es O(lgn)= O(h). Luego el costo es n/2h+1

Algoritmo Heapsort 1.- Construir un heap invocando a Build_Heap 2.- Intercambiar el primer elemento, la raíz y mayor elemento, del heap con el último. 3.- Restituir la propiedad heap en el heap de n-1 elementos. El costo de Heapsort es O(n lg n) porque el llamado a Build_Heap toma O(n) y luego tenemos n-1 llamados a Heapify cuyo tiempo es O(lgn). Heapsort(A) Build_Heap(A) for (i= lenght(A) downto 2 ) do exchange A[1 <-> A[i heap_size [A = heap_size [A-1 Heapify(A,1)

Colas de Prioridad Heapsort es muy bueno, pero es superado por quicksort (lo veremos luego). La aplicación más popular de heapsort es para implementar colas de prioridad. Una cola de prioridad es una estructura de datos que mantiene un conjunto S de elementos cada uno asociado con una clave key. La cola de prioridad soporta las siguientes operaciones: Insert(S,x): inserta x en el conjunto S Maximum(S): retorna el elemento con mayor clave. Extract-Max(S): remueve y retorna el elemento con mayor clave. Aplicaciones: - Itineración de tareas en sistemas de tiempo compartido - Colas de prioridad en simuladores conducidos por evento (Event-driven simulator)

Operaciones en Colas de prioridad Heap_Maximum(S): retorna el nodo raíz en tiempo (1). Heap_Extract_Max(A) if heap_size[A] <1 then error “Heap undeflow” max = A[1] A[1] = A[heap_size [A]] heap_size [A] = heap_size [A]-1 Heapify(A,1) return max Heap_Insert(A, key) heap_size [A] = heap_size [A]+1 i = heap_size [A] while (i > 1 and A[Parent(i)] < key) do A[i] = A[Parent(i)] i = Parent(i) A[i] = key Tiempo de Heap_Extract_Max : O(lg n) básicamente el tiempo de Heapify Tiempo de Heap_Insert : O(lg n) porque es el recorrido desde la nueva hoja a la raíz.

Divertimento 2 2 1 1 Se trata de colorear 9 vértices de esta estrella. Para ello usted debe partir de un vértice no coloreado, avanzar en línea recta con caminos de largo 2 y podrá colorear el vertice de llegada. ¿Puede usted colorear nueve vértices? 2 2 1 1