Estructuras de Datos ● Introducción y Heaps ● Docentes: ● Eugenia Simich ● Juan Manuel Rabasedas ● Sergio Giro.

Slides:



Advertisements
Presentaciones similares
Algebra de Boole SISTEMAS DIGITALES I.  En 1854 el matemático inglés George Boole formalizó un sistema algebraico de dos valores para expresar cierto.
Advertisements

T – Student teoria de las muestras pequeñas Paola Andrea Palacio Montero Estadística.
L ISTAS ENLAZADAS M.IA. Daniel Alejandro García López.
Miss Rocío Morales Vásquez Saint Louis School Educación Matemática NB2.
Introducción a la Programación Multimedial
NÚMEROS REALES U. D. 1 * 4º ESO E. Angel Prieto Benito
FUNCIONES, PROCESAMIENTO ELEMENTAL DE DATOS
2. Simplificación de funciones booleanas: Método de Karnaugh
Introducción al lenguaje C Instrucción IF – ELSE y el bucle WHILE
Árboles binarios. Algoritmos básicos
Universidad Autónoma del Estado de México
Tema 3 Árboles. Conceptos Generales. Curso 2014/2015 ETSISI UPM.
FUNCIONES, PROCESAMIENTO ELEMENTAL DE DATOS
Manejo de Punteros y objetos en memoria dinámica en C++
Estructuras de Datos Aun en problemas muy simples surge la necesidad de agrupar valores elementales de alguna manera. Cuando representamos una caja de.
Montículos Binarios (Binary Heaps)
FUNCIONES MATEMÁTICAS
Arreglos. en Lenguaje C n
Tema 4 Árboles Prof. Oscar Adolfo Vallejos.
MATRICES.
Listas enlazadas particulares
ANÁLISIS E INTERPRETACIÓN DE DATOS
Demostración de correctitud y terminación de ciclos
Ecuaciones de segundo grado
Tema 4 Elementos para el Desarrollo de Algoritmos
LENGUAJE DE PROGRAMACION III Estructuras Estáticas de Datos
OMRI 2017 *inserta fecha aquí*
Introducción ACTIVIDAD: magnitudes Conceptos:
Introducción a las estructuras de datos
Scratch Presentado por: Valentina Agudelo Huerfano J.M.
Tema 10 Las curvas de costes.
Iniciando la exploración
Sopa de letras en VBA Ficha 5 Paso a paso Conocer el problema Pág. 1
Sesión 2 : Números Primos
DOCENTE: ANGEL PALACIO BIENVENIDOS AL MUNDO DEL
Sistemas Numéricos 1. Introducción 2. Sistema de Numeración Decimal
Estructuras de Datos MC Beatriz Beltrán Martínez Primavera 2018
Tipos de Datos abstractos
Estructuras de Datos MC Beatriz Beltrán Martínez Primavera 2018
Unidad 4. Capítulo V. Ecuaciones homogéneas: Teoría.
Estructuras de Datos MC Beatriz Beltrán Martínez Primavera 2018
Árboles Binarios de Búsqueda (ABB)
Conferencia 2 TDA Lista lineal.
Tipos de Datos abstractos
INTRODUCCION Hasta ahora solo hemos tenido que trabajar con algunas variables en cada uno de los programas que hemos realizado. Sin embargo, en más de.
Estructuras de Datos Dinámicas
Fundamentos de Informática Especialidad de Electrónica –
TEMAS *Arboles Binarios *listas Abiertas y Cerradas - Inserción - Recorrido - Eliminación *Pilas - Concepto - Inserción - Recorrido -
EL TDA COLA Estructuras de Datos.
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
Estructuras de Datos Aun en problemas muy simples surge la necesidad de agrupar valores elementales de alguna manera. Cuando representamos una caja de.
Instituto de Educación Media Superior de la Ciudad de México
DEPARTAMENTO DE MATEMÁTICAS
MC Beatriz Beltrán Martínez Verano 2018
POTENCIAS Y RADICALES U. D. 2 * 4º ESO E. Angel Prieto Benito
Informática Ingeniería en Electrónica y Automática Industrial
ÁRBOLES DE EXPRESION. Un árbol de expresión sirve para evaluar expresiones del tipo: (a+b)*c/d Para que un árbol represente una expresión se deben tomar.
Estructura de los sistemas Operativos 1. Componentes de un sistema operativo  Administración de procesos  Administración de memoria  Subsistema de Entrada/Salida.
MATRIZ DE CHEQUEO DE PARIDAD
Árboles Binarios Estructuras de Datos.
Nelson Baloian, José A. Pino
CC 1002: Introducción a la Programación Clase 19
Manejo de Punteros y objetos en memoria dinámica en C++
Funciones de base.
Árboles Binarios Estructuras de Datos. Las estructuras dinámicas son las en la ejecución varia el número de elementos y uso de memoria a lo largo del.
Departamento de Ingeniería de Sistemas e Industrial
M.C. José Andrés Vázquez Flores
ALGORITMO DE ORDENAMIENTO POR BURBUJA. El método de la burbuja es uno de los mas simples, es tan fácil como comparar todos los elementos de una lista.
II Unidad: Lenguaje Algebraico. Término Algebraico Es una combinación de letras, números y signos de operaciones. Ejemplo: 3b² Para escribir una Término.
II Unidad: Lenguaje Algebraico Por Paloma Guzmán.
Transcripción de la presentación:

Estructuras de Datos ● Introducción y Heaps ● Docentes: ● Eugenia Simich ● Juan Manuel Rabasedas ● Sergio Giro

Cómo empezar?

● Mi definición: ”Organización sistemática de los datos para permitir una administración eficiente de los mismos usando un conjunto de operaciones”

Cómo empezar? ● Mi definición: ”Organización sistemática de los datos para permitir una administración eficiente de los mismos usando un conjunto de operaciones” ● Wikipedia: ”Es una manera particular de guardar y organizar datos en una computadora para que puedan ser usados de manera eficiente”

Ejemplos ● (No necesariamente informáticos) ● Agenda (organización sistemática? operaciones? eficientes?) ● Guía telefónica ● Planilla ● Guía turística ● Mapa de la ciudad

Arreglos/vectores ● Usos: geometría cartesiana (entre otros) ● Operaciones necesarias: ● Poner el valor para una componente ● Tomar el valor de una componente ● Operaciones derivadas: ● Suma, producto interno...

Arreglos/vectores ● Organización sistemática:

Arreglos/vectores ● Organización sistemática: ● Organizo las componentes como factores primos de un número ● (4,1,8) → = ● Leer la n-sima componente: descomponer el número y obtener la potencia correspondiente al n- simo primo ● Asignar la n-sima componente: dividir por p^{m} y multiplicar por p^{n}. Donde p es el n-simo primo, m es el valor anterior y n es el nuevo valor

Arreglos/vectores ● Organización sistemática: ● En un modelo de memoria lineal: ● Reservo espacio para n enteros a partir de la posicion b ● La n-sima componente es el entero en la posicion b+n ● Leer la n-sima componente: buscar el entero en la posicion b+n ● Asignar la n-sima componente: poner el nuevo valor en la posicion b+n

Arreglos/vectores ● Operaciones: ● Crear: Int → Arreglo ● Leer: Arreglo x Int → Int ● Asignar: Arreglo x Int x Int→ Arreglo ● Leer(a,i) se anota a[i] ● Asignar(a,i,j) es arreglo a despues de hacer a[i] = j ● Crear(n) en lenguaje C: malloc(n*sizeof(int))

Arreglos/vectores ● Operación derivada: producto interno ● prod: Arreglo x Arreglo → Int ● int prod (a,b,n) { ● int res = 0; ● for(int i = 0; i < n; i++) { ● res += a[i]*b[i]; ● } ● return res; ● }

(Min) Heaps ● Estructura de datos con las siguientes operaciones ● insertar : Heap x Int → Heap ● borrar_min : Heap → Heap ● obtener_minimo : Heap → Int ● Se utiliza para implementar colas de prioridad (priority queues)

(Min) Heaps ● Los heaps son colas de prioridad en las que los datos pueden recorrerse en forma de árbol ● En cada subárbol, la raíz es el elemento mínimo del subárbol

(Min) Heaps ● Para explicitar la estructura de árbol podemos agregar una operación adicional: ● descomponer: Heap → Heap x Int x Heap

Representación ● Podemos representar un árbol (y por lo tanto un heap) utilizando arreglos ● Se puede probar por inducción: ● el hijo izquierdo del nodo n está en la posición 2n+1 ● el hijo derecho en la posición 2n+2 ● padre(n) = (n-1) div 2

Representación descomponer(h) = descomponer( (a,r,s) ) = ((a,2r+1,s), a[r], (a,2r+2,s)) ● Para implementar la función descomponer podemos tener, además del arreglo, un entero r indicando la raíz ● Para saber si un nodo tiene hijos, alcanza con guardar la ultima posicion ocupada ● h = (a,r,s)

Implementación de las operaciones ● insertar: puedo poner el nuevo elemento al final del arreglo 3

Implementación de insertar ● insertar: puedo poner el nuevo elemento al final del arreglo ● No cumple la propiedad de heap 3

Implementación de insertar ● insertar: puedo poner el nuevo elemento al final del arreglo ● No cumple la propiedad de heap ● Podemos hacer que el subarbol cumpla la propiedad intercambiando el valor con el nodo superior

Implementación de insertar ● El nuevo árbol tampoco cumple la propiedad de heap 7...

Implementación de insertar ● El nuevo árbol tampoco cumple la propiedad de heap ● Pero puedo intercambiar nuevamente

Implementación de insertar ● Finalmente cumple con la propiedad de heap 7

Implementación de insertar ● insertar ( (a,r,s), n) es un heap (a',r',s') en el que: ● s' = s+1 ● r' = r ● a' es el arreglo luego de ejecutar: a[s+1] = n; flotar(a,s+1); 7 10

Implementación de insertar ● void flotar(int a[], int r) { ● while(padre(r) != r ● && a[r] < a[padre(r)]) { ● swap(a,r,padre(r)); ● r = padre(r); ● } ● void swap(int a[], int p, int q) { ● int aux = a[p]; ● a[p] = a[q]; ● a[q] = aux; ● } ● int padre(int i){ if(i ==0) return 0; return (i-1)/2; }

Corrección de insertar ● void flotar(int a[], int r) { ● while(padre(r) != r ● && a[r] < a[padre(r)]) { ● swap(a,r,padre(r)); ● r = padre(r); ● } ● Invariante: al finalizar el bucle, vale la propiedad de heap excepto que puede ser a[u] > a[r] si r desciende de u ● Sea c el valor de la variable r al comenzar el bucle, d el valor de r al terminar, sea a' el valor del arreglo al terminar ● Debemos demostrar a'[u] <= a'[t] para todo u, t tal que t es descendiente de u, t != d ● Consideramos diferentes casos para t y u ● Caso t = c Si u = padre(c), dado que entramos al bucle, teníamos a[c] = a'[padre(c)] = a'[u] u c = t ` u ` < >

Corrección de insertar ● void flotar(int a[], int r) { ● while(padre(r) != r ● && a[r] < a[padre(r)]) { ● swap(a,r,padre(r)); ● r = padre(r); ● } ● Invariante: al finalizar el bucle, vale la propiedad de heap excepto que puede ser a[u] > a[r] si r desciende de u ● Sea c el valor de la variable r al comenzar el bucle, d el valor de r al terminar, sea a' el valor del arreglo al terminar ● Debemos demostrar a'[u] <= a'[t] para todo u, t tal que t es descendiente de u, t != d ● Consideramos diferentes casos para t y u ● Caso t = c Si u != padre(c), por hipótesis a[u] <= a[d] = a'[c] d c = t ` u ` < > d u <=

Corrección de insertar ● void flotar(int a[], int r) { ● while(padre(r) != r ● && a[r] < a[padre(r)]) { ● swap(a,r,padre(r)); ● r = padre(r); ● } ● Invariante: al finalizar el bucle, vale la propiedad de heap excepto que puede ser a[u] > a[r] si r desciende de u ● Sea c el valor de la variable r al comenzar el bucle, d el valor de r al terminar, sea a' el valor del arreglo al terminar ● Debemos demostrar a'[u] <= a'[t] para todo u, t tal que t es descendiente de u, t != d ● Consideramos diferentes casos para t y u ● Caso t = padre(c) En este caso t = d, no debemos demostrar nada d = padre(c) = t c ` c ` < >

Corrección de insertar ● void flotar(int a[], int r) { ● while(padre(r) != r ● && a[r] < a[padre(r)]) { ● swap(a,r,padre(r)); ● r = padre(r); ● } ● Invariante: al finalizar el bucle, vale la propiedad de heap excepto que puede ser a[u] > a[r] si r desciende de u ● Sea c el valor de la variable r al comenzar el bucle, d el valor de r al terminar, sea a' el valor del arreglo al terminar ● Debemos demostrar a'[u] <= a'[t] para todo u, t tal que t es descendiente de u, t != d ● Consideramos diferentes casos para t y u ● Caso u = c Como la invariante valía, antes del bucle tenemos a[d] <= a[t]. Después del bucle a'[u] = a'[c] = a[d] <= a[t] = a'[t] c = u t ` d t ` d <=

Corrección de insertar ● void flotar(int a[], int r) { ● while(padre(r) != r ● && a[r] < a[padre(r)]) { ● swap(a,r,padre(r)); ● r = padre(r); ● } ● Invariante: al finalizar el bucle, vale la propiedad de heap excepto que puede ser a[u] > a[r] si r desciende de u ● Sea c el valor de la variable r al comenzar el bucle, d el valor de r al terminar, sea a' el valor del arreglo al terminar ● Debemos demostrar a'[u] <= a'[t] para todo u, t tal que t es descendiente de u, t != d ● Consideramos diferentes casos para t y u ● Caso u = c Como la invariante valía, antes del bucle tenemos a[d] <= a[t]. Después del bucle a'[u] = a'[c] = a[d] <= a[t] = a'[t] c = u t ` d t ` d <=

Corrección de insertar ● void flotar(int a[], int r) { ● while(padre(r) != r ● && a[r] < a[padre(r)]) { ● swap(a,r,padre(r)); ● r = padre(r); ● } ● Invariante: al finalizar el bucle, vale la propiedad de heap excepto que puede ser a[u] > a[r] si r desciende de u ● Sea c el valor de la variable r al comenzar el bucle, d el valor de r al terminar, sea a' el valor del arreglo al terminar ● Debemos demostrar a'[u] <= a'[t] para todo u, t tal que t es descendiente de u, t != d ● Consideramos diferentes casos para t y u ● Caso u = padre(c) Suponemos t != c (el caso u = padre(c), t = c fue el primero que vimos). En este caso a'[u] = a[c] < a[u] <= a[t] = a'[t] c t ` d = u = padre(c) t ` c d <= ><

Corrección de insertar ● void flotar(int a[], int r) { ● while(padre(r) != r ● && a[r] < a[padre(r)]) { ● swap(a,r,padre(r)); ● r = padre(r); ● } ● Invariante: al finalizar el bucle, vale la propiedad de heap excepto que puede ser a[u] > a[r] si r desciende de u ● Sea c el valor de la variable r al comenzar el bucle, d el valor de r al terminar, sea a' el valor del arreglo al terminar ● Debemos demostrar a'[u] <= a'[t] para todo u, t tal que t es descendiente de u, t != d ● En los otros casos la prueba es trivial (los valores de a y a' sólo cambian para c y padre(c) )

Corrección de insertar ● void flotar(int a[], int r) { ● while(padre(r) != r ● && a[r] < a[padre(r)]) { ● swap(a,r,padre(r)); ● r = padre(r); ● } ● Invariante: al finalizar el bucle, vale la propiedad de heap excepto que puede ser a[u] > a[r] si r desciende de u ● Una vez que el bucle sale, a[padre(r)] <= a[r]. Además, como vale la invariante, para todos los ancestros u de padre(r) tenemos a[u] <= a[padre(r)]. Por ende, a[u] <= a[r] para todo ancestro u de r. Junto con la invariante, esto asegura a[u] <= a[t] para todo u ancestro de t

Implementacion de borrar_min ● Sobreescribo la raíz con el último elemento ● De nuevo, no cumple con la propiedad de heap ● Puedo intercambiar la raíz con la raíz de un subárbol cuyo valor sea mínimo

Implementacion de borrar_min ● Sobreescribo la raíz con el último elemento ● De nuevo, no cumple con la propiedad de heap ● Puedo intercambiar la raíz con la raíz de un subárbol cuyo valor sea mínimo

Implementacion de borrar_min ● Sobreescribo la raíz con el último elemento ● De nuevo, no cumple con la propiedad de heap ● Puedo intercambiar la raíz con la raíz de un subárbol cuyo valor sea mínimo (notar que si subía el 6, quedaba el 6 sobre el 5). En este caso el 7 ”se hunde”

Implementacion de borrar_min ● borrar(a,r,s) = (a', r', s') ● donde ● s'=s-1 ● r' = r ● a' es el arreglo a después de hacer: a[0] = a[s]; hundir(a,0,s-1); void hundir(int a[], int pos, int size) { int swapPos=pos; if(hijo_izq(pos) <= size && a[hijo_izq(pos)] < a[pos]) { swapPos = hijo_izq(pos); } //swapPos tiene la posición con valor // mínimo entre pos e hijo_izq(pos) if(hijo_der(pos) <= size && a[hijo_der(pos)] < a[swapPos]) { swapPos = hijo_der(pos); } //swapPos tiene la posición con valor // mínimo entre pos, hijo_izq(pos) e // hijo_der(pos) if (pos != swapPos) { swap(a, pos, swapPos); hundir(a, swapPos); } }