Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ingeniería
Tema 4 Informática
Diccionarios Estructuras
de Datos II
2018/19
Diccionarios
Objetivos
Conocer el TAD Diccionario como contenedor asociativo
Conocer la tabla dispersa como estructura eficiente de implementación de diccionarios
Conocer las funciones de dispersión, así como los métodos de gestión de colisiones
más habituales
Contenidos
4.1 Conceptos
4.2 Especificación algebraica
4.3 Implementación
4.4 Implementación de diccionarios usando un ARN
4.5 Tablas dispersas
4.5.1 Conceptos
4.5.2 Funciones de dispersión
4.5.3 Resolución de colisiones
4.6 Implementación de diccionarios usando una tabla dispersa
Diccionarios
Duración
3 clases
Bibliografía
Data Structures and Algorithms in C++
Autores: Michael T. Goodrich, Roberto Tamassia, David M. Mount
Editorial: John Wiley & Sons, Inc.
Año: 2004
Págs. 363 – 410
Fundamentos de Estructuras de Datos. Soluciones en Ada, Java y C++
Autores: Zenón J. Hernández Figueroa y otros
Editorial : Thomson, 2005
Págs. 47 – 135
4
+ 5
Conceptos
Conceptos
Concreta
Independiente de qué otras claves estén almacenadas
Conceptos
El TAD de las funciones f: Dclaves Dvalores, donde Dclaves representa el conjunto de claves y
Dvalores el conjunto de valores, es conocido en el ámbito de las estructuras de datos, con el
nombre de diccionario (también conocido como tipo asociativo, funcional o tabla)
Un diccionario se define como un conjunto de pares (c, v), donde c se denomina clave y v
representa el valor asociado a la clave. Supondremos que en este conjunto no puede
haber dos pares con la misma clave, es decir, las claves son únicas
Las principales operaciones que suelen realizarse sobre diccionarios son:
crear una diccionario vacío
insertar un nuevo par (c, v)
comprobar la existencia de una clave en el diccionario
consultar el valor v asociado a una clave c
modificar el valor v asociado a una clave c
borrar un par (c, v)
comprobar si el diccionario está vacío
Conceptos
Cada dato tiene una clave y, asociado a ella, se guardan una serie de valores
Ejemplos de aplicaciones:
Agenda electrónica
Diccionario de sinónimos
Compiladores
etc.
9
+ 10
Especificación Algebracica
espec Diccionarios
usa booleanos
parámetro formal
géneros clave, valor
operaciones
_ == _ : clave clave booleano
fpf
género diccionario
operaciones
dVacío: diccionario
asignar: diccionario clave valor diccionario {inserta/modifica}
esVacío?: diccionario booleano
está?: diccionario clave booleano
parcial observar: diccionario clave valor
eliminar: diccionario clave diccionario
Especificación Algebracica
dominios de definición d: diccionario; c: clave
observar(d, c) está definido sólo si está?(d, c)
12
+ Implementación 13
Implementación
15
+ 16
Operación ARN
Diccionario
asignar
observar
eliminar
~Diccionario
18
+ 19
Conceptos
c1
c10 valor 6
c6
valor 8
c8
valor 10
1 f: X Y es inyectiva si y solo si: …
max
max-1
x1, x2 ∈ X tal que f(x1) =f(x2) x1=x2
+ 20
Conceptos
Todas las operaciones realizadas con este tipo de representación son de orden O(1)
Una alternativa a las tablas de acceso directo son las tablas dispersas o tablas hash,
que consiguen, aproximadamente, un coste de orden constante para todas las
operaciones
+ 21
Conceptos
Una tabla dispersa es una estructura similar a la tabla de acceso directo
h(c24) 0
h: Dclaves 0.. max-1 valor24
valor5
h(c5)
claves
h(c3)
c78 función de valor3
c5 dispersión (h)
c24
h(c78) valor78
c3
índices
max-1
+ 22
Conceptos
Uno de los aspectos fundamentales en las tablas dispersas consiste en realizar una buena
elección de la función h
Esta función debe distribuir las claves esperadas de la manera más uniforme posible en el
rango 0..max-1, de forma que la probabilidad de que 2 claves distintas (c1 ≠ c2) obtengan el
mismo valor de h (h(c1) = h(c2)) sea lo más baja posible
+ 23
Conceptos
Funciones de dispersión
Características de las funciones de dispersión
Las características que debería tener una buena función de dispersión son:
1. Rapidez de cálculo
Funciones de dispersión
Traducción de cadenas a enteros
Problema: Con las claves no numéricas o las claves muy grandes Ajuste en Intervalo
Funciones de dispersión
Funciones que obtienen valores en un intervalo (1/2)
División
Funciones de dispersión
Funciones que obtienen valores en un intervalo (2/2)
Plegamiento
• Consiste en dividir la clave c en partes de igual número de dígitos (la última puede
tener menos dígitos) y operar con ellas, tomando como índice los dígitos menos
significativos del resultado
• La operación entre las partes puede hacerse por medio de sumas o multiplicaciones
h (152635) = 15 + 26 + 35 = 76
h (934058) = 93 + 40 + 58 = 1 91 h (934058) = 91
Funciones de dispersión
Clases Universales de Funciones de Dispersión
Ejemplo:
• Sea p un número primo mayor o igual que C (cardinal del espacio de claves), y sean i
y j dos enteros menores que p. Se define hij: C 1..max-1, como:
hij(x)=((ix + j) mod p) mod max
• De forma que F= {hij | 1≤ i < p y 0 ≤ j < p}, es una clase universal de funciones de
dispersión de C en 1..max.
• Para seleccionar aleatoriamente una función de F sólo es necesario elegir dos enteros
(i, j) menores que p.
Resolución de Colisiones
Dispersión abierta: por encadenamiento
Todos los pares (clave, valor) cuya clave es asignada por la función de dispersión h a una
misma posición, se almacenan en una lista asociada a dicha posición
La zona de memoria dinámica donde se almacenan las listas asociadas a cada posición de
la tabla se denomina: zona de desbordamiento
Resolución de Colisiones
Dispersión cerrada: recolocación en la tabla
Consiste en almacenar los pares (clave, valor) cuya entrada primaria (índice) ya esté
ocupada (colisión), en otra posición libre de la propia tabla
Las colisiones se resuelven calculando una secuencia de huecos de dispersión se evita
el uso de estructuras auxiliares
Expresión para determinar la secuencia de búsqueda:
pk(c) = (h(c) + f(k)) mod max
c: clave a insertar
pk(c): posición a examinar en el k-ésimo intento (p0 es la posición inicial para c)
h(c): función de dispersión
f(k) : función que define la estrategia de búsqueda
Los pares (c,v) recolocados ocupan posiciones de futuras claves. El funcionamiento de
este método será bueno si el factor de carga α se mantiene por debajo de 0,8
Factor de carga α= n / max
n: nº de pares (c, v) almacenados en la tabla
max: tamaño de la tabla
Resolución de Colisiones
El factor de carga indica el nivel de ocupación de la tabla con pares almacenados
Si α = 1 n=max : Hay igual número de pares que de posiciones
Si α < 1 Hay menos pares que posiciones
Si α > 1 Hay más pares que posiciones
Prueba lineal
0
Probar sucesivamente en las posiciones que siguen a h(c) ⇒ f(k) = k :
h(c5) h(c3)
valor3 p1
c78 Prueba lineal
valor78
c5 pk h(c78) p2
valor5
c3
Resolución de Colisiones
Prueba cuadrática
f(k) = k2 :
h(c5) h(c3)
valor3 p1
c78 Prueba cuadrática
valor78
c5 pk h(c78)
p2
c3 valor5
Resolución de Colisiones
Los tiempos de las operaciones con la tabla tienden a degenerar cuando se trabaja
con un factor de carga alto ⇒ mejor mantenerlo por debajo de 0,8
Se requiere algún mecanismo que permita distinguir una posición libre de la que no
lo está ⇒ asociar un valor lógico a cada posición de la tabla que indique si está o no
ocupada
Resolución de Colisiones
Características de la dispersión cerrada
Búsqueda
1. Acceder a la posición h(c)
2. Si la posición está ocupada por c, fin de la búsqueda
3. Si la posición no está ocupada por c, seguir la misma secuencia de pk que se
empleó al insertar la clave, hasta encontrar la clave, una posición vacía o
finalizar la secuencia de índices pk
Solución: marcar las posiciones de la tabla con uno de los valores {“libre”,
“ocupado”, “liberado”}. La búsqueda continuará al encontrar un valor “liberado”
35
+ Implementación usando Tabla Dispersa 36
Si la tabla tiene dimensión max y hay N pares (clave, valor), con una función
h uniforme, la longitud media de las listas es N / max
Diccionario
asignar
observar
eliminar
~Diccionario