Diccionarios y Colas de Prioridad

31
Diccionarios y Colas de Prioridad Mag. Ing. Nancy López

Transcript of Diccionarios y Colas de Prioridad

Page 1: Diccionarios y Colas de Prioridad

Diccionarios y Colas de Prioridad

Mag. Ing. Nancy López

Page 2: Diccionarios y Colas de Prioridad

El TAD SET (Conjunto)En el diseño de algoritmos, la noción de conjunto es

usada como base para la formulación de tipos de datos abstractos muy importantes.

Un conjunto es una colección de elementos (o miembros), los que a su vez pueden ellos mismos ser conjuntos o si no elementos primitivos, llamados también átomos.

Todos los elementos de un conjunto son distintos, lo que implica que un conjunto no puede contener dos copias del mismo elemento.

Page 3: Diccionarios y Colas de Prioridad

Una notación usual para exhibir un conjunto es listar sus elementos de la siguiente forma: {1, 4}, que denota al conjunto cuyos elementos son los naturales 1 y 4.

Es importante destacar que los conjuntos no son listas, el orden en que los elementos de un conjunto son listados no es relevante ({4, 1} , y también {1, 4} denotan al mismo conjunto).

El TAD SET (Conjunto)

Page 4: Diccionarios y Colas de Prioridad

• Vacio c: construye el conjunto c vacío;• Insertar x c: agrega x a c, si no estaba en el

conjunto;• EsVacio c: retorna true si y sólo si el conjunto c

está vacío;• Pertenece x c: retorna true si y sólo si x está en c;• Borrar x c: elimina a x del conjunto c, si estaba;• Destruir c: destruye el conjunto c, liberando su

memoria;• Además de operaciones para la unión,

intersección y diferencia de conjuntos, entre otras.

El TAD SET (Conjunto)

Page 5: Diccionarios y Colas de Prioridad

Otras operaciones adicionales que suelen considerarse para conjuntos son, entre otras, las siguientes:

• Borrar: dado un elemento lo elimina del conjunto, si es éste pertenece al mismo. También Borrar_min y Borrar_max(borran el mínimo y el máximo elem).

• Min (Max): devuelve el elemento menor (mayor) del conjunto. Pre-condición: el conjunto es no vacío. Esta operación requiere un orden lineal sobre los elementos (o sobre sus claves).

• Igual: dado un conjunto, devuelve true si y sólo si el conjunto parámetro es igual al cual se le aplica el método. La igualdad es una operación útil y necesaria para la mayoría de los TADs.

• Inclusiones, Cardinalidad, …

El TAD SET (Conjunto)

Page 6: Diccionarios y Colas de Prioridad

El TAD Diccionario

Hay dos TADs especialmente utilizados, basados en el modelo de conjuntos:

Los diccionarios y las colas de prioridad.

Cuando se usa un conjunto en el diseño de unalgoritmo podría no ser necesario contar conoperaciones de unión o intersección o

diferencia.

Page 7: Diccionarios y Colas de Prioridad

A menudo lo que se necesita es simplemente manipular un conjunto de objetos al que periódicamente se le agregan o quitan elementos. También es usual que uno desee verificar si un determinado elemento forma parte o no del conjunto.

Un Tad Set con las operaciones Vacio, Insertar, EsVacio, Borrar y Pertenece recibe el nombre de diccionario.

(Una cola de prioridad es esencialmente un Tad Set con las operaciones Vacio, Insertar, EsVacio, Borrar_Min y Min)

El TAD Diccionario

Page 8: Diccionarios y Colas de Prioridad

• Vacio d: construye el diccionario (conjunto) vacío.• Insertar x d: agrega x a d, si no estaba en el

diccionario.• EsVacio d: retorna true si y sólo si el diccionario d

está vacío.• Pertenece x d: retorna true si y sólo si x está en d.• Borrar x d: elimina a x del diccionario d, si estaba.• Destruir d: destruye el diccionario d, liberando su

memoria.

El TAD Diccionario

Page 9: Diccionarios y Colas de Prioridad

Implementación del TAD Diccionario

Existen distintas posibles implementaciones de este tipo abstracto.

Una primera posibilidad es usando listas encadenadas (ordenadas o no) -memoria dinámica-

Otra posible implementación de un diccionario es por medio de un arreglo de booleanos. Este enfoque requiere que:

• los elementos del tipo base pertenezcan al subrango0..N, para algún natural N, o

• que pueda definirse una correspondencia uno a uno entre el tipo base y el anterior subrango de naturales.

Page 10: Diccionarios y Colas de Prioridad

Implementación del TAD Diccionario

Una tercer posible implementación es usar un arreglo con tope. Este enfoque garantiza una representación correcta siempre y cuando el tamaño del diccionario no supere el largo del arreglo.

Finalmente, una frecuentemente usada implementación es mediante ABB (o AVL). Este enfoque permite una eficiente definición de las operaciones y utilización del espacio de memoria.

Page 11: Diccionarios y Colas de Prioridad

Colas de prioridad

El término “cola de prioridad” se relaciona con:• La palabra “cola” sugiere la espera de cierto

servicio por ciertas personas u objetos.• La palabra “prioridad” sugiere que este servicio

no se proporciona por medio de una disciplina “primero en llegar, primero en ser atendido” que es la base del TAD Cola, sino que cada elemento tiene una prioridad basada en “la urgencia de su necesidad” (de ser atendido)

Page 12: Diccionarios y Colas de Prioridad

Colas de Prioridad

Ejemplos:• la sala de espera de un hospital, donde los

pacientes con problemas potencialmente mortales serán atendidos primero.

• Aún cuando los trabajos enviados a una impresora se suelen colocar en una cola, esto puede no ser siempre lo mejor. Por ejemplo, si los trabajos tienen prioridades en ser procesados.

• En el área de sistemas operativos y políticas de scheduling de procesos en sistemas de tiempo compartido.

Page 13: Diccionarios y Colas de Prioridad

• Prácticamente todas las realizaciones estudiadas para conjuntos (diccionarios) son también apropiada

• Existe una alternativa para implementar colas de Prioridad y no necesita punteros: – Los montículos o Heaps (Binary Heaps) para colas

de prioridad.

Colas de Prioridad

Page 14: Diccionarios y Colas de Prioridad

Colas de Prioridad

Una cola de prioridad es un Tad Set con lasoperaciones:

(constructores) Vacio, Insertar,(predicado) EsVacio,(selectores) Borrar_Min y Min.

Page 15: Diccionarios y Colas de Prioridad

Colas de Prioridad acotadas

• La implementación de colas de prioridad con binary heaps hace entonces referencia a una especificación de colas de prioridad acotadas (con una operación adicional Esta_llena() y con una precondición sobre la operación de inserción)

Page 16: Diccionarios y Colas de Prioridad

Colas de Prioridad acotadas

• Los Heaps tienen 2 propiedades:– una propiedad de la estructura.– una propiedad de orden del heap.

• Las operaciones van a tener que preservar estas propiedades.

• NOTA: la prioridad (el orden) puede ser sobre un campo de la información y no sobre todo el dato.

Page 17: Diccionarios y Colas de Prioridad

Propiedad de la estructura:Un heap es un árbol binario completamente lleno,

con la posible excepción del nivel más bajo, el cual se llena de izquierda a derecha. Un árbol así se llama un árbol binario completo.

La altura h de un árbol binario completo tiene entre 2h y 2h+1-1 nodos.

Debido a que un árbol binario completo es tan regular, se puede almacenar en un arreglo, sin recurrir a apuntadores.

Los montículos o Heaps (Binary Heaps)

Page 18: Diccionarios y Colas de Prioridad

Los montículos o Heaps (Binary Heaps)

Page 19: Diccionarios y Colas de Prioridad

Binary HeapsPropiedad de la estructura:Para cualquier elemento en la posición i del arreglo, el

hijo izquierdo está en la posición 2*i, el hijo derecho en la posición siguiente: 2*i+1 y el padre está en la posición i / 2.

Como vemos, no sólo no se necesitan punteros, sino que las operaciones necesarias para recorrer el árbol son muy sencillas y rápidas.

El único problema es que requerimos previamente un cálculo de tamaño máximo del heap, pero por lo general esto no es problemático. El tamaño del arreglo en el ejemplo es 13 --no 14 (el 0 es distinguido)--

Page 20: Diccionarios y Colas de Prioridad

Binary Heaps

Propiedad de orden del heap:Para todo nodo X, la clave en el padre de X es:

menor --si nos basamos en Sets para prioridades-- (menor o igual --si nos basamos en Multisetspara prioridades--) que la clave en X, con la excepción obvia de la raíz (donde esta el mínimo elemento).

Esta propiedad permite realizar eficientemente las propiedades de una cola de prioridad que refieren al mínimo.

Ejemplos:

Page 21: Diccionarios y Colas de Prioridad
Page 22: Diccionarios y Colas de Prioridad

Operaciones básicos para Heaps

Todas las operaciones son fáciles (conceptual y prácticamente de implementar). Todo el trabajo consiste en asegurarse que se mantenga la propiedad de orden del Heap.

• Min• Vacio• EsVacio• Insertar• Borrar_Min

Page 23: Diccionarios y Colas de Prioridad

• Min: simple, O(1).• Vacio, EsVacio: simples, O(1).• Insertar: O(log n) peor caso y O(1) en el caso

promedio.

Operaciones básicos para Heaps

Page 24: Diccionarios y Colas de Prioridad

Insertar el 14 en (vale incluso si hay prioridades repetidas):

Operaciones básicos para Heaps

Page 25: Diccionarios y Colas de Prioridad
Page 26: Diccionarios y Colas de Prioridad
Page 27: Diccionarios y Colas de Prioridad
Page 28: Diccionarios y Colas de Prioridad
Page 29: Diccionarios y Colas de Prioridad
Page 30: Diccionarios y Colas de Prioridad
Page 31: Diccionarios y Colas de Prioridad