Vous êtes sur la page 1sur 72

Programa de teora

Parte I. Estructuras de Datos.


1. Abstracciones y especificaciones.

2. Conjuntos y diccionarios.
3. Representacin de conjuntos mediante rboles. 4. Grafos.

Parte II. Algortmica.


1. Anlisis de algoritmos. 2. Divide y vencers. 3. Algoritmos voraces. 4. Programacin dinmica. 5. Backtracking. 6. Ramificacin y poda.
A.E.D. Tema 2. Conjuntos y Diccionarios. 1

PARTE I: ESTRUCTURAS DE DATOS

Tema 2. Conjuntos y Diccionarios.


2.1. Repaso del TAD Conjunto. 2.2. Implementaciones bsicas. 2.3. El TAD Diccionario. 2.4. Las tablas de dispersin. 2.5. Relaciones muchos a muchos.
A.E.D. Tema 2. Conjuntos y Diccionarios. 2

2.1. Repaso del TAD Conjunto. Definicin y propiedades.


Conjunto: Coleccin no ordenada de elementos (o miembros) distintos. Elemento: Cualquier cosa, puede ser un elemento primitivo o, a su vez, un conjunto.
C: Conjunto de enteros 8 1 3 5 Diagrama de patata
3

A.E.D. Tema 2. Conjuntos y Diccionarios.

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.

coleccin no ordenada Se refiere al orden de insercin de los elementos.


A.E.D. Tema 2. Conjuntos y Diccionarios. 5

2.1. Repaso del TAD Conjunto. Repaso de Notacin de Conjuntos.


Definicin:

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

A.E.D. Tema 2. Conjuntos y Diccionarios.

2.1. Repaso del TAD Conjunto. Operaciones ms comunes.


C: Conjunto de todos los Conjunto[T] a, b, c C; xT Vaco : p C Unin : C x C p C Interseccin : C x C p C Diferencia : C x C p C Combina : C x C p C xa
7

a:= c:= a b c:= a b c:= a b c:= a b, con a b =

Miembro : T x C p B

A.E.D. Tema 2. Conjuntos y Diccionarios.

2.1. Repaso del TAD Conjunto. Operaciones ms comunes.


Inserta : T x C p C Suprime : T x C p C Min : C p T Max : C p T Igual : C x C p B a:= a {x} a:= a {x} minxa(x) maxxa(x) a == b

elementos distintos Si insertamos un elemento que ya pertenece, obtenemos el mismo conjunto.


A.E.D. Tema 2. Conjuntos y Diccionarios. 8

2.2. Implementaciones bsicas.


Problema: Cmo representar el tipo conjunto, de forma que las operaciones se ejecuten rpidamente, con un uso razonable de memoria? Respuesta: en este tema y el siguiente. Dos tipos de implementaciones bsicas:
Mediante arrays de booleanos. Mediante listas de elementos.

La mejor implementacin depende de cada aplicacin concreta:


Operaciones ms frecuentes en esa aplicacin. Tamao y variabilidad de los conjuntos usados. Etc.
A.E.D. Tema 2. Conjuntos y Diccionarios. 9

2.2. Implementaciones bsicas.


C: Conjunto 8 1 3 5

10

1 0 1 0 1 0 0 1 0 0 8 1 3 5

Array de booleanos Lista de elementos


d
10

A.E.D. Tema 2. Conjuntos y Diccionarios.

2.2. Implementaciones bsicas.


2.2.1. Mediante arrays de booleanos.
Idea: Cada elemento del conjunto universal se representa
con 1 bit. Para cada conjunto concreto A, el bit asociado a un elemento vale: 1 - Si el elemento pertenece al conjunto A 0 - Si el elemento no pertenece a A

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

2.2.1. Mediante arrays de booleanos.

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]

Unin, interseccin, diferencia: se transforman en las operaciones booleanas adecuadas.


A.E.D. Tema 2. Conjuntos y Diccionarios. 12

2.2.1. Mediante arrays de booleanos.


operacin Unin (A, B: Conjunto[T]; var C: Conjunto[T]) para cada i en Rango(T) hacer C[i]:= A[i] OR B[i] operacin Interseccin (A, B: Conjunto[T]; var C: Conjunto[T]) para cada i en Rango(T) hacer C[i]:= A[i] AND B[i] operacin Diferencia (A, B: Conjunto[T]; var C: Conjunto[T]) para cada i en Rango(T) hacer C[i]:= A[i] AND NOT B[i]

A.E.D. Tema 2. Conjuntos y Diccionarios.

13

2.2.1. Mediante arrays de booleanos.


operacin Inserta (x: T; var C: Conjunto[T]) C[x]:= 1 operacin Suprime (x: T; var C: Conjunto[T]) C[x]:= 0 operacin Miembro (x: T; C: Conjunto[T]): booleano devolver C[x]==1

Cunto tardan las operaciones anteriores? Cmo seran: Igual, Min, Max, ...?
A.E.D. Tema 2. Conjuntos y Diccionarios. 14

2.2.1. Mediante arrays de booleanos.

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

2.2.1. Mediante arrays de booleanos.

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

2.2.1. Mediante arrays de booleanos.

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

2.2.2. Mediante listas de elementos.

Idea: Guardar en una lista los elementos que


pertenecen al conjunto.

Definicin: tipo Conjunto[T] = Lista[T] C = {1, 5, 8, 3}


8 1 3 5
C: Conjunto[T]

A.E.D. Tema 2. Conjuntos y Diccionarios.

18

2.2.2. Mediante listas de elementos.

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.


operacin Miembro (x: T; C: Conjunto[T]): booleano Primero(C) mientras Actual(C) x AND NOT EsUltimo(C) hacer Avanzar(C) devolver Actual(C) == x operacin Interseccin (A, B; Conjunto[T]; var C: Conjunto[T]) C:= ListaVaca Primero(A) mientras NOT EsUltimo(A) hacer si Miembro(Actual(A), B) entonces InsLista(C, Actual(A)) Avanzar(A) finmientras
A.E.D. Tema 2. Conjuntos y Diccionarios. 20

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

2.2.2. Mediante listas de elementos. Listas no ordenadas. 8 1 3 5


C: Conjunto[T]

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

2.2.2. Mediante listas de elementos.


operacin Miembro (x: T; C: Conjunto[T]): booleano Primero(C) mientras Actual(C) < x AND NOT EsUltimo(C) hacer Avanzar(C) devolver Actual(C) == x

C: Conjunto[T]

Cunto es el tiempo de ejecucin ahora?


A.E.D. Tema 2. Conjuntos y Diccionarios. 23

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

A.E.D. Tema 2. Conjuntos y Diccionarios.

2.2.2. Mediante listas de elementos.


operacin Unin (A, B: Conjunto[T]; var C: Conjunto[T]) C:= ListaVaca Primero(A) Primero(B) mientras NOT (EsUltimo(A) AND EsUltimo(B)) hacer si EsUltimo(B) OR Actual(A)<Actual(B) entonces InsLista(C, Actual(A)) Avanza(A) sino si EsUltimo(A) OR Actual(B)<Actual(A) entonces InsLista(C, Actual(B)) Avanza(B) sino InsLista(C, Actual(A)) Avanza(A) Avanza(B) finsi finmientras
A.E.D. Tema 2. Conjuntos y Diccionarios. 25

2.2.2. Mediante listas de elementos.

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.2. Implementaciones bsicas. Conclusiones


Arrays de booleanos: muy rpida para las operaciones de insercin y consulta. Inviable si el tamao del conjunto universal es muy grande. Listas de elementos: uso razonable de memoria, proporcional al tamao usado. Muy ineficiente para la insercin y consulta de un elemento. Solucin: Tablas de dispersin, estructuras de rbol, combinacin de estructuras, etc.
A.E.D. Tema 2. Conjuntos y Diccionarios. 27

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

2.3. El TAD Diccionario.


C: Conjunto 8 1 3 5

D: Diccionario 263 Pepito 7.7 628 Mara 6.2

823 Lope 3.4

A.E.D. Tema 2. Conjuntos y Diccionarios.

29

2.3. El TAD Diccionario.


clave Definicin: Asociacin. Una asociacin es un par valor (clave: tipo_clave; valor: tipo_valor). 263 Pepito 7.7

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

2.3. El TAD Diccionario.


Todo lo dicho sobre implementacin de conjuntos se puede aplicar (extender) a diccionarios. Implementacin:
Con arrays de booleanos: Imposible! Conjunto universal muy limitado. Cmo conseguir la asociacin clave-valor? Con listas de elementos: Representacin ms compleja y muy ineficiente para insercin, consulta, etc.

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.3. El TAD Diccionario.


operacin Vaco (var D: Diccionario[tclave, tvalor]) D.ltimo:= 0 oper Inserta (clave: tclave; valor: tvalor; var D: Diccionario[tc,tv]) para i:= 1 hasta D.ltimo hacer si D.datos[i].clave == clave entonces D.datos[i].valor:= valor acabar finpara si D.ltimo < mximo entonces D.ltimo:= D.ltimo + 1 D.datos[D.ltimo]:= (clave, valor) sino Error (El diccionario est lleno) finsi
A.E.D. Tema 2. Conjuntos y Diccionarios. 32

2.3. El TAD Diccionario.


operacin Consulta (clave: tclave; D: Diccionario[tc,tv]): tvalor para i:= 1 hasta D.ltimo hacer si D.datos[i].clave == clave entonces devolver D.datos[i].valor finpara devolver NULO operacin Suprime (clave: tclave; var D: Diccionario[tc,tv]) i:= 1 mientras (D.datos[i].clave { clave) AND (i < D.ltimo) hacer i:= i + 1 finmientras si D.datos[i].clave == clave entonces D.datos[i]:= D.datos[D.ltimo] D.ltimo:= D.ltimo 1 finsi
A.E.D. Tema 2. Conjuntos y Diccionarios. 33

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?

A.E.D. Tema 2. Conjuntos y Diccionarios.

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

A.E.D. Tema 2. Conjuntos y Diccionarios.

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

A.E.D. Tema 2. Conjuntos y Diccionarios.

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.

A.E.D. Tema 2. Conjuntos y Diccionarios.

38

2.4.1. Dispersin abierta.


Las celdas de la tabla no son elementos (o asociaciones), sino listas de elementos, tambin llamadas cubetas.

tipo TablaHash[T]= array [0..B-1] de Lista[T]


Sea B= 10, D= {9, 25, 33, 976, 285, 541, 543, 2180}
T: TablaHash[T]
0 1 2 3 4 5 6 7 8 9

2180

541

33

25

976

543

285

A.E.D. Tema 2. Conjuntos y Diccionarios.

39

2.4.1. Dispersin abierta.

La tabla de dispersin est formada por B cubetas. Dentro de cada una estn los sinnimos. El conjunto de sinnimos es llamado clase.

Eficiencia de la dispersin abierta


El tiempo de las operaciones es proporcional al tamao de las listas (cubetas). Supongamos B cubetas y n elementos en la tabla. Si todos los elementos se reparten uniformemente cada cubeta ser de longitud: 1 + n/B
A.E.D. Tema 2. Conjuntos y Diccionarios. 40

2.4.1. Dispersin abierta.

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

2.4.2. Dispersin cerrada.

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

2.4.2. Dispersin cerrada.

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

Dnde ira a para el 99? Y luego el 12? Y...?


+
A.E.D. Tema 2. Conjuntos y Diccionarios. 43

2.4.2. Dispersin cerrada.


La secuencia de posiciones recorridas para un elemento se suele denominar cadena o secuencia de bsqueda.

Consultar (clave, T): valor


k:= h(clave) i:= 0 mientras T[k].clave clave AND T[k].clave VACIO AND i<B hacer i:= i + 1 k:= hi(clave) finmientras si T[k].clave == clave entonces devolver T[k].valor sino devolver NULO
A.E.D. Tema 2. Conjuntos y Diccionarios. 44

2.4.2. Dispersin cerrada.

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

Resultado: 285 no est en la tabla!!

A.E.D. Tema 2. Conjuntos y Diccionarios.

45

2.4.2. Dispersin cerrada.

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

Resultado: Encontrado 285 en la tabla!!

Cmo sera consultar 13? E insertar 13?


A.E.D. Tema 2. Conjuntos y Diccionarios. 46

2.4.2. Dispersin cerrada.

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

A.E.D. Tema 2. Conjuntos y Diccionarios.

47

2.4.2. Dispersin cerrada.

Utilizacin de memoria en disp. cerrada


Si 1 puntero = k1 bytes, 1 elemento = k2 bytes. Memoria en la tabla: k2 B O bien: k1 B + k2 n En dispersin abierta tenamos: k1 B + (k1 + k2)n Cul es mejor?

A.E.D. Tema 2. Conjuntos y Diccionarios.

48

2.4.2. Dispersin cerrada.

Eficiencia de las operaciones


La tabla nunca se puede llenar con ms de B elementos. La probabilidad de colisin crece cuantos ms elementos hayan, disminuyendo la eficiencia. El costo de Inserta es O(1/(1-n/B)) Cuando n p B, el tiempo tiende a infinito. En dispersin abierta tenamos: O(1+n/B)

A.E.D. Tema 2. Conjuntos y Diccionarios.

49

2.4.2. Dispersin cerrada.

1/(1-n/B) 1+n/B

A.E.D. Tema 2. Conjuntos y Diccionarios.

50

2.4.2. Dispersin cerrada.

Reestructuracin de las tablas de dispersin


Para evitar el problema de la prdida de eficiencia, si el nmero de elementos, n, aumenta mucho, se puede crear una nueva tabla con ms cubetas, B, reestructurar. Dispersin abierta: reestructurar si n > 2 B Dispersin cerrada: reestructurar si n > 0.75 B

A.E.D. Tema 2. Conjuntos y Diccionarios.

51

2.4.3. Funciones de dispersin.

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.

A.E.D. Tema 2. Conjuntos y Diccionarios.

52

2.4.3. Funciones de dispersin.

Ejemplos de funciones de dispersin


Sea la clave x un entero.
Mtodo de la multiplicacin. h(x) = (x*C) mod B; con C y B primos entre s Mtodo de divisin. h(x) = (x mod C) mod B; con C y B primos entre s Mtodo del centro del cuadrado. h(x) = x2 / 100 mod B h(x)= x2 / C mod B Escoger un C, tal que BC2 } K2, para x en el intervalo (0, ..., K). Ej.: K= 1000; B= 8; C=354; h(456)= 3
A.E.D. Tema 2. Conjuntos y Diccionarios. 53

2.4.3. Funciones de dispersin.

Sea la clave x= x1 x2 x3 x4 x5 x6 un entero o cadena.


Mtodo de plegado (folding).

h(x) = (x1 x2 + x3 x4 + x5 x6) mod B h(x) = (x3 x2 x1 + x6 x5 x4) mod B


Mtodo de extraccin.

h(x) = (x4 x1 x6) mod B


Combinacin de mtodos.

h(x) = (x4 x1 x6)2 / D + C(x3 x5 x2) mod B h(x) = (C1*x2 mod C2 + x*C3) mod B

A.E.D. Tema 2. Conjuntos y Diccionarios. 54

2.4.3. Funciones de redispersin.

Redispersin lineal. hi(x) = h(i, x) = (h(x) + i) mod B


Es sencilla de aplicar. Se recorren todas las cubetas para i= 1, , B-1. Problema de agrupamiento: Si se llenan varias cubetas consecutivas y hay una colisin, se debe consultar todo el grupo. Aumenta el tamao de este grupo, haciendo que las inserciones y bsquedas sean ms lentas.
0 1 2 3 4 5 6 7 8 9 . . . .
B-2 B-1

A.E.D. Tema 2. Conjuntos y Diccionarios.

55

2.4.3. Funciones de redispersin.

Redispersin con saltos de tamao C. hi(x) = h(i, x) = (h(x) + Ci) mod B


Es sencilla de aplicar. Se recorren todas las cubetas de la tabla si C y B son primos entre s. Inconveniente: no resuelve el problema del agrupamiento.

Redispersin cuadrtica. h(i, x) = (h(x) + D(i)) mod B


D(i) = (+1, -1, +22, -22, +32, -32, ) Funciona cuando B= 4k + 3, para k N. Resuelve el problema del agrupamiento?
A.E.D. Tema 2. Conjuntos y Diccionarios. 56

2.4.3. Funciones de redispersin.

Redispersin doble. h(i, x) = (h(x) + C(x)i) mod B


Idea: es como una redispersin con saltos de tamao C(x), donde el tamao del salto depende de x. Si B es un nmero primo, C(x) es una funcin: C : tipo_clave p [1, , B-1] Se resuelve el problema del agrupamiento si los sinnimos (con igual valor h(x)) producen distinto valor de C(x). Ejemplo. Sea x = x1x2x3x4 h(x) = x1x4 mod B C(x) = 1 + (x3x2 mod (B-1))
A.E.D. Tema 2. Conjuntos y Diccionarios. 57

2.4. Las tablas de dispersin. Conclusiones:


Idea bsica: la funcin de dispersin, h, dice dnde se debe meter cada elemento. Cada x va a la posicin h(x), en principio Con suficientes cubetas y una buena funcin h, el tiempo de las operaciones sera O(1). Una buena funcin de dispersin es esencial. Cul usar? Depende de la aplicacin. Las tablas de dispersin son muy buenas para Inserta, Suprime y Consulta, pero Qu ocurre con Unin, Interseccin, Mximo, Mnimo, listar los elementos por orden, etc.?
A.E.D. Tema 2. Conjuntos y Diccionarios. 58

2.5. Relaciones muchos a muchos.


En muchas aplicaciones se almacenan conjuntos de dos tipos distintos y relaciones entre elementos de ambos.

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

2.5. Relaciones muchos a muchos.

Tipos de relaciones:
Relacin uno a muchos. Ej. Relacin sultnmujer.
Sultanes Mujeres 1 a c 2 b d e

A.E.D. Tema 2. Conjuntos y Diccionarios.

60

2.5. Relaciones muchos a muchos.

Tipos de relaciones:
Relacin muchos a muchos. Ej. Relacin contenido en.
Pginas web Palabras 1 2 3 pato algo donde mal

A.E.D. Tema 2. Conjuntos y Diccionarios.

61

2.5. Relaciones muchos a muchos.


Otros ejemplos de relacin muchos a muchos:
Alumnos de la universidad, cursos y matriculaciones de alumnos en cursos. Personas, libros y prstamos de libros a personas. Ciudades y carreteras entre ciudades.

Cuestin: Cmo representar una relacin de este tipo? Objetivos: uso de memoria razonable y tiempo de ejecucin rpido.

A.E.D. Tema 2. Conjuntos y Diccionarios.

62

2.5. Relaciones muchos a muchos.


Supongamos que existen 3 mil millones de pginas (3109), 20 millones de palabras distintas (2107) y cada pgina tiene 30 palabras diferentes. En total tenemos: 310930 = 90 mil millones de relaciones (91010). Cada palabra aparece de media en 4.500 pginas.

A.E.D. Tema 2. Conjuntos y Diccionarios.

63

2.5.1. Representaciones bsicas.


Opcin 1: Para cada pgina, almacenar una lista con
las palabras que contiene (lista de punteros a palabras). 1 2 3 algo donde algo donde pato pato mal

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

2.5.1. Representaciones bsicas.


Opcin 2: Para cada palabra, almacenar una lista con
las pginas donde aparece (lista de identificadores). algo donde mal 1 1 1 3 2

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

2.5.1. Representaciones bsicas.


Opcin 3: Matriz de booleanos. Una dimensin para las
pginas y otra para las palabras.
1 algo donde mal pato X X X X X X 2 3 X

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

2.5.2. Listas mltiples.


Ninguna estructura, por s misma, proporciona un buen tiempo de ejecucin con un uso de memoria razonable. Con listas, una operacin es rpida y la otra muy ineficiente. Solucin: combinar las dos estructuras de listas en una sola. Listas de palabras en una pgina: sig_pal. Lista de pginas con una palabra: sig_pag. Las listas son circulares.

A.E.D. Tema 2. Conjuntos y Diccionarios.

67

2.5.2. Listas mltiples.


1 algo donde mal pato Celdas de la estructura de listas mltiples:
palabra sig_pal pri_pag pagina pri_pal sig_pag sig_pal sig_pag

algo

2
68

A.E.D. Tema 2. Conjuntos y Diccionarios.

2.5.2. Listas mltiples.


Buscar pginas dada una palabra, pal Recorrer la lista horizontal empezando en pal.pri_pag. Para cada elemento recorrer verticalmente hasta llegar (circularmente) a una pgina. Buscar palabras en una pgina dada, pag Recorrer la lista vertical empezando en pag.pri_pal. Para cada elemento recorrer horizontalmente hasta llegar (circularmente) a una palabra.

A.E.D. Tema 2. Conjuntos y Diccionarios.

69

2.5.2. Listas mltiples.


Uso de memoria
Sea k1 = tamao de 1 puntero = 8 bytes Cada celda ocupa: 2k1 = 16 bytes En total hay 91010 celdas. Memoria necesaria: 2k191010 bytes = 1.44 Terabytes = Lo mismo que con listas simples

Eficiencia de las operaciones


Buscar pginas dada una palabra: Tamao lista horizontal (promedio) * Tamao lista vertical (promedio) = 30*4.500 = 135.000 celdas recorridas. Buscar palabras en una pgina dada: Tamao lista vertical (promedio) * Tamao lista horizontal (promedio) = 4.500*30 = 135.000 celdas recorridas.
A.E.D. Tema 2. Conjuntos y Diccionarios. 70

2.5.2. Listas mltiples.

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.

A.E.D. Tema 2. Conjuntos y Diccionarios.

71

2.5.2. Listas mltiples.

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

Vous aimerez peut-être aussi