Académique Documents
Professionnel Documents
Culture Documents
2. Conjuntos y diccionarios.
3. Representacin de conjuntos mediante rboles. 4. Grafos.
2.1. Repaso del TAD Conjunto. En programacin, se impone que todos los elementos sean del mismo tipo: Conjunto[ T ] (conjuntos de enteros, de caracteres, de cadenas ...)
En qu se diferencia el TAD Conjunto del TAD Lista? En qu se diferencia el TAD Conjunto del TAD Bolsa?
A.E.D. Tema 2. Conjuntos y Diccionarios. 4
2.1. Repaso del TAD Conjunto. Puede existir una relacin de orden en el conjunto. Relacin < de orden en un conjunto C:
Propiedad transitiva: para todo a, b, c, si (a<b) y (b<c) entonces (a<c). Orden total: para todo a, b, slo una de las afirmaciones (a<b), (b<a) o (a=b) es cierta.
Por extensin
A= {a, b, c, ..., z} B= {1, 4, 7} = {4, 7, 1} Pertenencia: Conjunto vaco: Inclusin: Unin: xA AB AB
Mediante proposiciones
C= {x | proposicin de x} D= {x | x es primo y menor que 90} No pertenencia: Conjunto universal: Interseccin: Diferencia: xA
U
AB AB
6
Miembro : T x C p B
10
1 0 1 0 1 0 0 1 0 0 8 1 3 5
Definicin: tipo Conjunto[T] = array [1..Rango(T)] de booleano Donde Rango(T) es el tamao del conj. universal.
A.E.D. Tema 2. Conjuntos y Diccionarios. 11
Ejemplo: T = {a, b, , g}
C= Conjunto[T] A = {a, c, d, e, g} B = {c, e, f, g}
a b c d e f g
A: Conjunto[a..g]
1
a
0
b
1
c
1
d
1
e
0
f
1
g
B: Conjunto[a..g]
13
Cunto tardan las operaciones anteriores? Cmo seran: Igual, Min, Max, ...?
A.E.D. Tema 2. Conjuntos y Diccionarios. 14
Ventajas
Operaciones muy sencillas de implementar. No hace falta usar memoria dinmica. El tamao usado es proporcional al tamao del conjunto universal, independientemente de los elementos que contenga el conjunto. Ventaja o inconveniente?
A.E.D. Tema 2. Conjuntos y Diccionarios. 15
Ejemplo. Implementacin en C, con T = {1, 2, , 64} tipo Conjunto[T] = long long Unin (A, B, C) C = A | B; Interseccin (A, B, C) C = A & B; Inserta (x, C) C = C | (1<<(x-1)); Cada conjunto ocupa 8 bytes, y las operaciones se hacen en 1 o 3 ciclos de la CPU!
A.E.D. Tema 2. Conjuntos y Diccionarios. 16
Ejemplo. Implementacin con T = enteros de 32 bits = {0, 1, , 232-1} tipo Conjunto[T] = array [4.294.967.296] de bits = array [536.870.912] de bytes Cada conjunto ocupa 0.5 Gygabytes, independientemente de que contenga slo uno o dos elementos! El tiempo es proporcional a ese tamao!
A.E.D. Tema 2. Conjuntos y Diccionarios. 17
18
Ventajas:
Utiliza espacio proporcional al tamao del conjunto representado (no al conjunto universal). El conjunto universal puede ser muy grande, o incluso infinito.
Inconvenientes:
Las operaciones son menos eficientes si el conjunto universal es reducido. Gasta ms memoria y tiempo si los conjuntos estn muy llenos. Ms complejo de implementar.
A.E.D. Tema 2. Conjuntos y Diccionarios. 19
2.2.2. Mediante listas de elementos. Cunto tiempo tardan las operaciones anteriores? Suponemos una lista de tamao n y otra m (o ambas de tamao n). Cmo sera Unin, Diferencia, Inserta, Suprime, etc.? Inconveniente: Unin, Interseccin y Diferencia recorren la lista B muchas veces (una por cada elemento de A). Se puede mejorar usando listas ordenadas.
A.E.D. Tema 2. Conjuntos y Diccionarios. 21
Listas ordenadas. 1 3 5 8
C: Conjunto[T]
Miembro, Inserta, Suprime: Parar si encontramos un elemento mayor que el buscado. Unin, Interseccin, Diferencia: Recorrido simultneo (y nico) de ambas listas.
A.E.D. Tema 2. Conjuntos y Diccionarios. 22
C: Conjunto[T]
2.2.2. Mediante listas de elementos. Unin: Idea parecida al procedimiento de mezcla, en la ordenacin por mezcla. 1
actual
A: Conjunto[T]
3
actual
B: Conjunto[T]
5 8
C: Conjunto[T]
9
24
Cunto es el tiempo de ejecucin? Es sustancial la mejora? Cmo seran la Interseccin y la Diferencia? Cmo seran las operaciones Min, Max? Cunto es el uso de memoria para tamao n? Supongamos que 1 puntero = k1 bytes, 1 elemento = k2 bytes.
A.E.D. Tema 2. Conjuntos y Diccionarios. 26
2.3. El TAD Diccionario. Muchas aplicaciones usan conjuntos de datos, que pueden variar en tiempo de ejecucin. Cada elemento tiene una clave, y asociado a ella se guardan una serie de valores. Las operaciones de consulta son por clave. Ejemplos. Agenda electrnica, diccionario de sinnimos, base de datos de empleados, notas de alumnos, etc. Normalmente, no son frecuentes las operaciones de unin, interseccin o diferencia, sino inserciones, consultas y eliminaciones.
A.E.D. Tema 2. Conjuntos y Diccionarios. 28
29
Un diccionario es, bsicamente, un conjunto de asociaciones con las operaciones Inserta, Suprime, Miembro y Vaco. TAD Diccionario[tclave, tvalor]
Inserta (clave: tclave; valor: tvalor, var D: Diccionario[tcl,tval]) Consulta (clave: tclave; D: Diccionario[tcl,tval]): tvalor Suprime (clave: tclave; var D: Diccionario[tcl,tval]) Vaco (var D: Diccionario[tcl,tval])
A.E.D. Tema 2. Conjuntos y Diccionarios. 30
Representacin sencilla mediante arrays. tipo Diccionario[tclave, tvalor] = registro ltimo: entero datos: array [1..mximo] de Asociacion[tclave, tvalor] finregistro
A.E.D. Tema 2. Conjuntos y Diccionarios. 31
2.4. Las tablas de dispersin. La representacin de conjuntos o diccionarios con listas o arrays tiene un tiempo de O(n), para Inserta, Suprime y Miembro, con un uso razonable de memoria. Con arrays de booleanos el tiempo es O(1), pero tiene muchas limitaciones de memoria. Cmo aprovechar lo mejor de uno y otro tipo?
34
2.4. Las tablas de dispersin. Idea: Reservar un tamao fijo, un array T con B posiciones (0, ..., B-1). Dada una clave x (sea del tipo que sea) calcular la posicin donde colocarlo, mediante una funcin h.
Claves x h T: array [0..B-1]
0 1 2 . . . B-1
35
2.4. Las tablas de dispersin. Funcin de dispersin (hash): h h : tipo_clave p [0, , B-1] Insertar (clave, valor, T): Aplicar h(clave) y almacenar en esa posicin valor. T[h(clave)]:= valor Consultar (clave, T): valor: Devolver la posicin de la tabla en h(clave). devolver T[h(clave)] Se consigue O(1), en teora
36
2.4. Las tablas de dispersin. Ejemplo. tipo_clave = entero de 32 bits. Fun. de disp.: h(x) = (37x2 + 61xsqrt(x)) mod B Ms sencilla: h(x) = x mdulo B
Sea B= 10, D= {9, 25, 33, 976, 285, 541, 543, 2180} h(x) = x mod 10
D
0 2180 1 541 2 3 33 543 4 5 25 285 6 976 7 8 9 9
Habemvs problema
A.E.D. Tema 2. Conjuntos y Diccionarios. 37
2.4. Las tablas de dispersin. Qu ocurre si para dos elementos distintos x e y, ocurre que h(x) = h(y)? Definicin: Si (x { y) Y (h(x) = h(y)) entonces se dice que x e y son sinnimos. Los distintos mtodos de dispersin difieren en el tratamiento de los sinnimos. Tipos de dispersin (hashing): Dispersin abierta. Dispersin cerrada.
38
2180
541
33
25
976
543
285
39
La tabla de dispersin est formada por B cubetas. Dentro de cada una estn los sinnimos. El conjunto de sinnimos es llamado clase.
Tiempo de Inserta, Suprime, Consulta: O(1+n/B) Ojo: Qu ocurre si la funcin de dispersin no reparte bien los elementos?
Utilizacin de memoria
Si 1 puntero = k1 bytes, 1 elemento = k2 bytes. En las celdas: (k1 + k2)n En la tabla: k1 B
Conclusin:
Menos cubetas: Se gasta menos memoria. Ms cubetas: Operaciones ms rpidas.
A.E.D. Tema 2. Conjuntos y Diccionarios. 41
Las celdas de la tabla son elementos del diccionario (no listas). No se ocupa un espacio adicional de memoria en listas. tipo TablaHash[ tc, tv ]= array [0..B-1] de (tc, tv) Si al insertar un elemento nuevo x, ya est ocupado h(x), se dice que ocurre una colisin. En caso de colisin se hace redispersin: buscar una nueva posicin donde meter el elemento x.
A.E.D. Tema 2. Conjuntos y Diccionarios. 42
Redispersin: Si falla h(x), aplicar h1(x), h2(x), ... hasta encontrar una posicin libre. Definir la familia de funciones hi(x). Ejemplo. Redispersin lineal: hi(x)= (h(x) + i) mod B
Sea B= 10, D= {9, 25, 33, 976, 285, 541, 543, 2180}
2180 541 543 33 25 285 976 9
T: TablaHash
Cmo sera la insercin? Y la eliminacin? Ojo con la eliminacin. Ejemplo. Eliminar 976 y luego consultar 285.
285
0 2180 1 541 2 3 33 4 543 5 25 6 976 7 285 8 9 9
45
Moraleja: en la eliminacin no se pueden romper las secuencias de bsqueda. Solucin. Usar una marca especial de elemento eliminado, para que siga la bsqueda. Ejemplo. Eliminar 976 y luego consultar 285.
285
0 2180 1 541 2 3 33 4 543 5 25 6 976 OJO 7 285 8 9 9
En la operacin Consulta, la bsqueda sigue al encontrar la marca de elemento eliminado. En Inserta tambin sigue, pero se puede usar como una posicin libre. Otra posible solucin. Mover algunos elementos, cuya secuencia de bsqueda pase por la posicin eliminada. Ejemplo. Eliminar 25 y luego eliminar 33.
0 2180 1 541 2 3 33 4 543 5 25 6 976 7 285 8 9 9
47
48
49
1/(1-n/B) 1+n/B
50
51
En ambos anlisis se supone una buena funcin de dispersin. Si no es buena el tiempo puede ser mucho mayor Propiedades de una buena funcin de dispersin
Repartir los elementos en la tabla de manera uniforme: debe ser lo ms aleatoria posible. La funcin debe ser fcil de calcular (eficiente). Ojo: h(x) es funcin de x, devuelve siempre el mismo valor para un mismo valor de x.
52
h(x) = (x4 x1 x6)2 / D + C(x3 x5 x2) mod B h(x) = (C1*x2 mod C2 + x*C3) mod B
55
Tipos de relaciones:
Relacin uno a uno. Ej. Relacin marido-mujer.
Hombres Mujeres 1 2 3
A.E.D. Tema 2. Conjuntos y Diccionarios.
a b c
59
Tipos de relaciones:
Relacin uno a muchos. Ej. Relacin sultnmujer.
Sultanes Mujeres 1 a c 2 b d e
60
Tipos de relaciones:
Relacin muchos a muchos. Ej. Relacin contenido en.
Pginas web Palabras 1 2 3 pato algo donde mal
61
Cuestin: Cmo representar una relacin de este tipo? Objetivos: uso de memoria razonable y tiempo de ejecucin rpido.
62
63
Sea k1 = tamao de 1 puntero = 8 bytes Uso de memoria: 2k191010 bytes = 1,44 Terabytes Buscar palabras en una pgina dada: recorrer (de media) 30 asociaciones. Buscar pginas dada una palabra: habra que recorrer las 91010 asociaciones. Muy ineficiente.
A.E.D. Tema 2. Conjuntos y Diccionarios. 64
pato 2 3 Sea k1 = tamao de 1 puntero o identificador = 8 bytes Uso de memoria: 2k191010 bytes = 1,44 Terabytes Buscar pginas dada una palabra: recorrer (de media) 4.500 asociaciones. Buscar palabras en una pgina dada: habra que recorrer las 91010 asociaciones. Muy ineficiente.
A.E.D. Tema 2. Conjuntos y Diccionarios. 65
Uso de memoria: 3109 x 2107 bits = 6/81016 bytes = 75.000 Terabytes!! 50.000 veces ms memoria!! Slo 1 de cada 700.000 celdas ser true. Buscar pginas dada una palabra: recorrer una fila: 3109 elementos. Buscar palabras en una pgina dada: recorrer una columna: 2107 elementos.
A.E.D. Tema 2. Conjuntos y Diccionarios. 66
67
algo
2
68
69
Conclusiones
Las listas simples por separado presentan problemas en una u otra operacin. Usando listas mltiples conseguimos operaciones eficientes, con un uso de memoria razonable. Problema general: representacin de matrices escasas. Aadiendo informacin redundante en las listas es posible mejorar ms la eficiencia, a costa de usar ms memoria.
71
Conclusin general
En algunas aplicaciones es posible, y adecuado, combinar varias estructuras de datos en una sola. Sobre unos mismos datos podemos tener diferentes estructuras de acceso: estructuras de datos mltiples. Normalmente, estas estructuras mejoran la eficiencia a costa de usar ms memoria.
A.E.D. Tema 2. Conjuntos y Diccionarios. 72