A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación...

40
A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante listas enlazadas 3.2. El TDA diccionario. 3.3. Tablas de dispersión. 3.3.1. Dispersión abierta. 3.3.2. Dispersión cerrada. 3.3.3. Funciones de dispersión. 3.4. Combinación de estructuras de datos. 3.4.1. Relación muchos a muchos. 3.4.2. Listas múltiples. 3.4.3. Estructuras de datos múltiples

Transcript of A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación...

Page 1: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 1 Tema 3. Conjuntos.

Tema 3. Conjuntos y diccionarios.

3.1. Conjuntos.3.1.1. Implementación por vectores de bits3.1.2. Implementación mediante listas enlazadas

3.2. El TDA diccionario.3.3. Tablas de dispersión.

3.3.1. Dispersión abierta.3.3.2. Dispersión cerrada.3.3.3. Funciones de dispersión.

3.4. Combinación de estructuras de datos.3.4.1. Relación muchos a muchos.3.4.2. Listas múltiples.3.4.3. Estructuras de datos múltiples

Page 2: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 2 Tema 3. Conjuntos.

3.1. Conjuntos.Definiciones y propiedades.

• Conjunto: colección no ordenada de elementos (o miembros) distintos.

• Elemento: cualquier cosa, puede ser un conjunto o un elemento primitivo (átomo).

En programación:• Puede haber repetición de elementos (bolsas).• Todos los elementos suelen ser del mismo tipo (enteros,

caracteres, cadenas, ...)• Los elementos pueden estar ordenados.

Relación “<“ de orden de un conjunto S:– Orden total: para todo a, b, sólo una de las afirmaciones (a<b),

(b<a) o (a=b) es cierta.– Propiedad transitiva: para todo a, b, c, si (a<b) y (b<c) entonces

(a<c).

Page 3: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 3 Tema 3. Conjuntos.

3.1. Conjuntos.

Notación de conjuntos.

• Definición:

Por extensión Mediante proposiciones

A= {a, b, c, .., z} C= {x | proposición de x}

B= {1, 4, 7} = {4, 7, 1} D= {x | x es primo y menor que 90}

• Pertenencia: x A • No pertenencia: x A

• Conjunto vacío: V = Ø • Conjunto universal: U =

U• Inclusión: A B • Intersección: A

B

• Unión: A B • Diferencia: A - B

Page 4: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 4 Tema 3. Conjuntos.

3.1. Conjuntos.El TDA Conjunto: Operaciones más comunes.

A, B, C y S conjuntos; x de tipo elemento• Unión (A, B, C) C:= A B• Intersección (A, B, C) C:= A B• Diferencia (A, B, C) C:= A - B• Combina (A, B, C) C:= A B, con A B = Ø• bool= Miembro (x, A) Verdad si x A. Falso si x A• Anula (A) A:= Ø• Inserta (x, A) A:= A {x}• Suprime (x, A) A:= A - {x}• Asigna (A, B) A:= B• Min (A) Devuelve el menor elemento de A• Max (A) Devuelve el mayor elemento de A• bool= Igual (A, B) Verdad si A = B. Falso si A B• S= Encuentra (x) Devuelve el conjunto al que pertenece

x

Page 5: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 5 Tema 3. Conjuntos.

3.1. Conjuntos.Ejemplos.

A:= {3, 5, 6, 8} B:= {2, 3, 5, 7, 9}

• Unión (A, B, C) C:= {3, 5, 6, 8, 2, 7, 9}• Intersección (A, B, C) C:= {3, 5}• Diferencia (A, B, C) C:= {6, 8}• Combina (A, B, C) Error, ya que A B Ø• Miembro (6, A) Verdad• Anula (A) A:= Ø• Inserta (5, A) A:= {3, 5, 6, 8}• Inserta (2, A) A:= {2, 3, 5, 6, 8}• Suprime (1, A) A:= {3, 5, 6, 8}• Asigna (A, B) A:= {2, 3, 5, 7, 9}• Min (A) 3• Max (A) 8• Igual (A, B) Falso• Encuentra (7) B• Encuentra (3) Error, ya que 3 A, 3 B.

Page 6: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 6 Tema 3. Conjuntos.

3.1. Conjuntos: implementaciones.

• Dos tipos de implementaciones básicas:– Mediante vectores de bits.– Mediante listas enlazadas.

• La mejor implementación depende del uso que hagamos de los conjuntos:– Operaciones más frecuentes.– Tamaño de los conjuntos usados.

Page 7: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 7 Tema 3. Conjuntos.

3.1.1. Conjuntos: implementación por vectores de bits.

• Idea: Cada elemento del conjunto universal se representa con 1 bit. Para cada conjunto A, el bit asociado a un elemento vale:1 - si el elemento pertenece al conjunto A

0 - si el elemento no pertenece a A

• Definición:

tipo Conjunto = array [1..N] de booleano

a b c d e f gA 1 0 1 1 0 0 1B 0 0 1 0 1 1 1

A B 1 0 1 1 1 1 1A B 0 0 1 0 0 0 1A - B 1 0 0 1 0 0 0

Page 8: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 8 Tema 3. Conjuntos.

3.1.1. Conjuntos: implementación por vectores de bits.

• Unión (A, B, C) O(n)

Para cada elemento i del conjunto universal hacerC[i]:= A[i] O B[i]

• Intersección (A, B, C) O(n)

Para cada elemento i del conjunto universal hacerC[i]:= A[i] Y B[i]

• Diferencia (A, B, C) O(n)

Para cada elemento i del conjunto universal hacerC[i]:= A[i] Y NO B[i]

• Inserta (i, A) , Suprime (i, A) O(cte)

A[i]:= 1 A[i]:= 0

¿Cómo serían: Miembro, Combina, Anula, Asigna, Igual, Min, Max, Encuentra, ...?

Page 9: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 9 Tema 3. Conjuntos.

3.1.1. Conjuntos: implementación por vectores de bits.

Ventajas:• Operaciones muy sencillas de implementar. Se pueden realizar

sin necesidad de usar memoria dinámica.• Miembro, Inserta y Suprime tienen un tiempo constante.• Unión, Intersección y Diferencia se pueden realizar en un

tiempo proporcional al tamaño del conjunto universal.• Si el conjunto universal es tan pequeño como el nº de bits de una

palabra de la máquina, las operaciones anteriores se pueden realizar con una simple operación lógica.

Inconvenientes:• Utiliza espacio proporcional al tamaño del conjunto universal.• El conjunto universal no puede ser muy grande ni infinito.• Cada elemento debe tener un índice.

Page 10: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 10 Tema 3. Conjuntos.

3.1.2. Conjuntos: Implementación mediantelistas enlazadas.

• Idea: Guardar en una lista los elementos del conjunto.

• Definición:

tipo Conjunto[Tipo ] = Lista[Tipo];• Si el conjunto tiene un orden, se pueden usar listas ordenadas para

mejorar la eficiencia de las operaciones.

Ventajas:• Utiliza espacio proporcional al tamaño del conjunto representado

(no al conjunto universal).• El conjunto universal puede ser muy grande, o incluso infinito.

Inconvenientes:• Operaciones más complejas de implementar.• Algunas operaciones son menos eficientes.

Page 11: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 11 Tema 3. Conjuntos.

3.1.2. Conjuntos: Implementación mediantelistas enlazadas.

Listas no ordenadas.• Miembro (x, A)

– Es necesario recorrer toda la lista: O(n)

Para cada elemento act de la lista hacerSi (x=act) entonces devolver Verdad

Devolver Falso

• Intersección (A, B, C)– Un elemento está en la intersección si está en las listas A y B.– Comparar cada elemento de A con cada uno de B: O(n2)

Anula(C)Para cada elemento act de la lista A hacer

Si (Miembro(act, B)) entonces Inserta(act, C)

¿Cómo serían: Unión, Diferencia, Combina, Anula, Asigna, Igual, Min, Max, ...?

Page 12: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 12 Tema 3. Conjuntos.

3.1.2. Conjuntos: Implementación mediantelistas enlazadas.

Listas ordenadas.• Miembro (x, A)

– Puesto que la lista está ordenada, sólo es necesario buscar hasta encontrar x o un elemento mayor que x.

– En el caso medio necesitaremos buscar n/2 posiciones: O(n).

act:= Primero(A)Mientras (act Nil) y (act x) hacer

Si (x=act) entonces devolver VerdadSino act:= Siguiente(act, A)

Devolver Falso

Page 13: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 13 Tema 3. Conjuntos.

3.1.2. Conjuntos: Implementación mediantelistas enlazadas.

Listas ordenadas.• Intersección (A, B, C): Recorrer las dos listas a la vez, avanzando la que tenga

valor actual menor: O(n).

act1:= Primero (A)act2:= Primero (B)Anula (C)Mientras (act1 Nil) y (act2 Nil) hacer

Si (act1=act2) entoncesInserta(act1, C)act1:= Siguiente(act1, A)act2:= Siguiente(act2, B)

SinoSi (act1 < act2) entonces

act1:= Siguiente(act1, A)Sino

act2:= Siguiente(act2, B)

Page 14: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 14 Tema 3. Conjuntos.

3.1.2. Conjuntos: Implementación mediantelistas enlazadas.

Listas ordenadas.• Unión (A, B, C)

– Es muy parecido. Meter todos los elementos de A y B en orden.

– Si hay dos elementos iguales se mete uno. En otro caso se mete el menor, y se avanza la lista correspondiente.

– Cuando acaba una lista se meten los que queden de la otra lista.

• Diferencia (A, B, C)– Meter el elemento actual de A si es menor que el de B (no si son iguales

o si es mayor).

• Asigna (A, B)– Copiar la lista B en A.

– No es suficiente con apuntar A a B, pues entonces si se modificara B también se modificaría A.

Page 15: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 15 Tema 3. Conjuntos.

3.1.2. Conjuntos: Implementación mediantelistas enlazadas.

Listas ordenadas.• Min (A), Max (A)

– El primero y el último elemento de la lista, respectivamente. ¿Coste?

• Suprime (x, A)– Buscar x, eliminarlo si existe.

• Inserta (x, A)– Insertar el elemento en la posición adecuada.Se busca hasta que se

halle uno igual o mayor, o el fin de la lista. Si es igual no se inserta. Si es mayor se inserta antes.

Page 16: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 16 Tema 3. Conjuntos.

3.2. El TAD diccionario.• En muchas aplicaciones necesitamos guardar datos de un conjunto

de elementos, que pueden variar en tiempo de ejecución.• P. ej.: agenda electrónica, diccionario de sinónimos, base de datos

de empleados, notas de alumnos, etc.• Particularidades:

– Los datos se guardan en un solo sitio, no siendo necesarias las operaciones de unión, intersección o diferencia.

– Cada elemento tiene una clave, y asociado a ella se guardan una serie de valores.

• Definición: Una asociación es un par (clave: tipo_clave, valor: tipo_valor).

tipo Asociacion = registroclave: tipo_clavevalor: tipo_valor

finregistro

Page 17: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 17 Tema 3. Conjuntos.

3.2. El TDA diccionario.• Definición: Un diccionario es un conjunto de asociaciones, con las

operaciones Inserta, Suprime, Miembro y Anula.

• Implementación:– Con vectores de bits: Conjunto universal muy limitado. ¿Cómo

conseguir la asociación clave-valor?

– Con listas enlazadas: Representación más compleja y menos eficiente.

• Otra posibilidad es la representación mediante arrays.

tipo Diccionario = registroúltimo: enterodatos: array [1..máximo] de Asociacion

finregistro• La representación es más sencilla, pero hay un límite en el tamaño de los

diccionarios.

Page 18: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 18 Tema 3. Conjuntos.

3.2. El TDA diccionario.

• Anula (D: Diccionario)D.último:= 0

• Miembro (x: tipo_clave, D: Diccionario): tipo_valorDesde i:= 1 hasta D.último hacer

Si (D.datos[i].clave=x) Devolver D.datos[i].valor

Devolver NULO

• Inserta (x: tipo_clave, v: tipo_valor, D: Diccionario)Si (no Miembro(x, D))

Si (D.último < máximo) D.último:= D.último + 1D.datos[D.último]:= (x, v)

Sino Error (‘El diccionario está lleno’)

• Suprime (x: tipo_clave, D: Diccionario)i:= 1Mientras (D.datos[i].clave x) y (i < D.último) hacer

i:= i+1Si (D.datos[i].clave = x)

D.datos[i]:= D.datos[D.último]D.último:= D.último - 1

Page 19: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 19 Tema 3. Conjuntos.

3.3. Tablas de dispersión (tablas hash).• La representación de conjuntos o diccionarios con listas o arrays tiene

un tiempo de O(n), para Inserta, Suprime y Miembro.• Con vectores de bits el tiempo es O(cte), pero tiene muchas

limitaciones.• ¿Cómo aprovechar lo mejor de uno y otro tipo?

• Idea:– Usar un array con B posiciones (0, ..., B-1).

– Dada una clave x (sea del tipo que sea) calcular una posición mediante una función:

h(x) = posición en (0..B-1) h: Función de dispersión– El elemento (x, v) se inserta en esa posición.

0 1 2 . . . . B-1

Page 20: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 20 Tema 3. Conjuntos.

3.3. Tablas de dispersión (tablas hash).

• Para buscar el elemento con clave x, aplicar la función h(x) y buscar en la posición correspondiente.

• Ej.: Si x de tipo entero h(x) = x módulo B

Si x de tipo cadena h(x) = (suma de códigos ascii (x)) mod B

• Ej.: B= 10; x de tipo entero;

h(x) = x mod 10

D= {9, 25, 33, 285, 541, 543, 1976, 2180}

0 1 2 3 4 5 6 7 8 9

2180 541 33543

28525

1976 9

• En promedio se necesita un tiempo constante O(cte): aplicar h(x) y acceder a esa posición.

Page 21: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 21 Tema 3. Conjuntos.

3.3. Tablas de dispersión (tablas hash).

• El tipo de x no está restringido. Si es un registro, podemos tomar uno de sus campos como clave, y aplicar la función sobre él.

• Función de dispersión: h: Clave [0, ..., B-1]• Tamaño de la tabla B: aproximadamente sobre el número de elementos

de los conjuntos (normalmente, B << rango de claves).

• ¿Qué ocurre si para dos elementos distintos x, y, ocurre que h(x) = h(y)?• Definición: Si (x y) (h(x) = h(y)) entonces se dice que x, y son

sinónimos.• Los distintos métodos de dispersión difieren en el tratamiento de los

sinónimos. Tipos de dispersión:– Dispersión abierta.

– Dispersión cerrada.

Page 22: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 22 Tema 3. Conjuntos.

3.3.1. Dispersión abierta.• Las celdas del array no son elementos (o asociaciones), sino listas

de elementos, también llamadas cubetas.

tipe TablaHash= array [0..B-1] de Lista_asociacion

• La tabla de dispersión está formada por B cubetas. Dentro de cada cubeta se encuentran los elementos sinónimos (con igual valor de h).

• El conjunto de sinónimos es llamado clase.

0 2480

1 541

2

3 33 543

4

5 285 25

6 1976

7

8

9 9

Page 23: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 23 Tema 3. Conjuntos.

3.3.1. Dispersión abierta.

• Coste de inserta, suprime, consulta, con conjunto con n elementos:– Repartidos de forma equitativa: O(1+n/B). Con

B>n es O(const)– Todos los elementos sinónimos: O(n).

• Ocupación de memoria,

Cada puntero ocupa k1 bytes, y cada asociación k2 bytes:

B*k1+n*(k1+k2)

Page 24: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 24 Tema 3. Conjuntos.

3.3.2. Dispersión cerrada.

• Las celdas del array son elementos del diccionario (no listas). No se ocupa un espacio adicional de memoria en listas.

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

• Si al insertar un elemento nuevo x, ya está ocupado h(x), se dice que ocurre una colisión.

• En este caso será necesario hacer redispersión: buscar una nueva posición para meter el elemento.

• Redispersión: Si falla h(x), aplicar h1(x), h2(x), ... hasta encontrar una posición libre.

• Redispersión lineal: hi(x)= (h(x) + i) mod B• La secuencia de posiciones recorridas para un elemento se suele

denominar cadena o secuencia de búsqueda.

0 1 2 3 4 5 6 7 8 9

2180 541 33 543 285 1976 25 9

Page 25: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 25 Tema 3. Conjuntos.

3.3.2. Dispersión cerrada.• Miembro (x, D):

– Examinar la posición h(x).– Si x está en la posición h(x) entonces devolver Verdad (o Tabla[h(x)].valor).– Si está vacía entonces no es miembro, devolver Falso.– En otro caso, la posición está ocupada pero por otro elemento. Debemos

examinar las posiciones h1(x), h2(x), ... y así sucesivamente hasta encontrar x, vacío o examinar toda la tabla.

• ¿Qué ocurre con la eliminación de elementos?Necesitamos una marca especial “suprimido”, que indique la posición de

un elemento borrado.– En la función Miembro, se sigue la búsqueda al llegar a un suprimido.– En Inserta el espacio de ese elemento se puede utilizar (como si fuera vacío).

• Problema de la redispersión lineal: Si se llenan varias cubetas consecutivas y hay una colisión, se debe consultar todo el grupo. Aumenta el tamaño de este grupo, haciendo que las inserciones y búsquedas sean más lentas.

0 1 2 . . . B-1

Page 26: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 26 Tema 3. Conjuntos.

3.3.2. Dispersión cerrada: operacionesOperación Buscar(D:Diccionario[tclave,tvalor];c:tclave):entero

i:= 1

k:= h(c)

mientras (i<B) Y (D[k].clave≠NULO) Y (D[k].clave≠c)

k:=hi(c)

i:=i + 1

finmientras

devolver k

operación Inserta(var D:Diccionario[tclave,tvalor];c:tclave;v:tvalor)

k:=Buscar(D,c)

si (D[k].clave=NULO) O (D[k].clave=c)

D[k].clave:=c

D[k].valor:=v

sino

error (``La tabla está llena.'')

finsi

Page 27: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 27 Tema 3. Conjuntos.

3.3.2. Dispersión cerrada: operaciones

Operación Suprime(var D:Diccionario[tclave,tvalor];c:tclave)

k:=Buscar(D,c)

si (D[k].clave=c)

D[k].clave:=SUPRIMIDO

D[k].valor:=NULO

finsi

• Si las eliminaciones son frecuentes pérdida de eficiencia:

Cada ver que se suprime mover datos en la misma clase para evitar huecos.

De vez en cuando eliminar los SUPRIMIDO de la tabla.

Page 28: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 28 Tema 3. Conjuntos.

3.3.2. Dispersión cerrada

• Coste memoria: B*k2

normalmente k2>k1, y

B*k2>B*k1+n*(k1+k2) (dispersión abierta)

• Coste de Insertar:

Probabilidad colisión: n/B

Probab. al menos dos colisiones: n/B*(n-1)/(B-1) ≈ n/B*n/B ...

Longitud promedio de búsqueda:

1+n/B+(n/B)2+...+(n/B)n<1/(1-n/B)

Si n próximo a B, valor muy alto: establecer capacidad máxima de llenado de las cubetas, y reestructurar cuando se llega a ese valor.

Page 29: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 29 Tema 3. Conjuntos.

3.3.3. Funciones de dispersión.

• Propiedades de una buena función de dispersión– La función debe minimizar el número de sinónimos: debe ser lo más

aleatoria posible y repartir los elementos en la tabla de manera uniforme.

– La función debe ser fácil de calcular (buscamos eficiencia).

– Ojo: h(x) es función de x, devuelve siempre el mismo valor para un mismo valor de x.

Algunas funciones de dispersión• Método de la multiplicación:

h(x) = (x * C) mod B; para algún C, con C y B primos entre sí

• Método de la división:h(x) = (x mod P) mod B; P > B

• Método de tomar los dígitos centrales:Escoger un C, tal que BC2 K2, para x en el intervalo (0, ..., K).h(x)= x2 / C mod B Ej.: K= 1000; B= 8; C=354; h(456)= 3

• Otro posible método:h(x) = (C1*x2 / C2 + x*C3) mod B

Page 30: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 30 Tema 3. Conjuntos.

3.3.3. Funciones de dispersión.

• Método de plegado o folding.Con cadenas. Agrupar caracteres de n en n:

Cada carácter es un número en el intervalo 0..127.Se suman los valores de los grupos.

Ej.: x= abcdefgh h(x):= ( (128)3a + (128)2b + (128)c + d

+(128)3e + (128)2f + (128)g + h ) mod B;

Con enteros. Agrupar los dígitos de n en n:h(x) = ((x div 109) + (x div 106) + (x div 103) + x ) mod B

Con reales. Agrupar dígitos decimales de n en n:h(x) = ((x * 100) + (x * 104) + (x * 106) + ... ) mod B

• Extracción:Evita el coste O(n), tomando sólo una parte de la clave.

• Método de base:Hacer cambio de base de la clave y considerarlo en la base original.Ej: 1999, en base 9 es 2661, y se hace 2661 mod B

Page 31: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 31 Tema 3. Conjuntos.

3.3.3. Estrategias de redispersión.

• Intervalos constantes mayores que 1:hi(x) = (h(x) + C*i) mod B; para algún C>1– Ej.: B= 8, C= 3, h(x)= 4, se buscaría en: 4, 7, 2, 5, 0, 2, 6, 1.– B y C deben ser primos entre sí, para buscar en todas las posiciones.– No se soluciona el problema de la lineal, ya que se crean grupos a saltos

de C.

• Redispersión cuadrática:hi(x) = (h(x) + (-1)i-1 (i+1)/22) mod BPara que se recorran todos los valores B debe ser primo de la forma B=4k+3

• Saltos de tamaño variable, o redispersión doble:hi(x) = (h(x) + i*C(x)) mod BC(x) da valores en (1,2,...,B-1)

Ej: C(x)=1+(x2/D+Ex) mod (B-1)

Page 32: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 32 Tema 3. Conjuntos.

3.3.3. Estrategias de redispersión.• Permutaciones aleatorias:

hi(x) = (h(x) + Di) mod B; para Di= (D1, D2, ...) una permutación de 1, 2, ..., B-1– La permutación es fijada de antemano.– Se soluciona el problema para determinadas permutaciones Di.

Método para obtener una permutación:– Sea B una potencia de 2. Se toma una constante K, en el intervalo (1, ..., B-

1).– Empezamos con un valor cualquiera D1= Di

– Di+1:= 2*Di

– Si Di+1>B entonces

Resta:= Di+1 - B; Di+1:= Resta K; Di = (5, 1, 2, 4, 3, 6, 7, 5, ...)

Ej.: B = 8; K = 3 = 011b;

D1 = 5 = 101b

D1 D2 D3 D4 D5 D6 D7 D1Di*2Resta

Resta3

101 1010010001

010 100 1000000011

110 1100100111

1110110101

Page 33: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 33 Tema 3. Conjuntos.

3.3.3. Funciones de dispersión.Eficiencia• Dispersión abierta.

– Tenemos B cubetas, y N elementos almacenados en total.– Cada lista tendrá de media N/B miembros.– Inserta, Suprime y Miembro tendrán un tiempo de O(1+N/B).– Si N B, entonces tendremos O(cte).– Suponemos una buena función h: reparte los elementos en las cubetas de

forma uniforme.

• Dispersión cerrada.– La tabla nunca se puede llenar con más de B elementos.– La probabilidad de colisión crece cuantos más elementos haya,

disminuyendo la eficiencia.– El costo de Inserta es O(1/(1-N/B)). Cuando N B tiende a infinito.

Reestructuración de las tablas de dispersión• Para evitar el problema de la pérdida de eficiencia, si el tamaño de N aumenta

mucho, se puede crear una nueva tabla con más elementos B, reestructurar.

• Dispersión abierta: reestructurar si N > 2 B

• Dispersión cerrada: reestructurar si N > 0.9 B

Page 34: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 34 Tema 3. Conjuntos.

3.4. Combinación de estructuras de datos.3.4.1. Relación muchos a muchos.

• En muchas aplicaciones se requiere almacenar información de dos tipos distintos y relaciones entre objetos de esos tipos.

• Ej.: base de datos de alumnos, cursos y matriculaciones de alumnos en cursos; personas, libros y préstamos de libros a personas.

• Asociación de muchos a muchos: un alumno puede estar matriculado en muchos cursos y en un curso pueden haber muchos alumnos.

Representaciones posibles• Array bidimensional: Matricula[Alumno, Curso] = (0, 1)

– Insertar, Suprimir son muy rápidas.– Consultar los cursos de un alumno y los alumnos de un curso: recorrer una

fila o una columna, respectivamente, de la matriz. O(n)– La memoria está mal utilizada.

Algebra Física A.E.D.Pepito X

Alicia X X

Dolores X X

Juan X

Page 35: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 35 Tema 3. Conjuntos.

3.4.1. Relación muchos a muchos.Representaciones posibles• Mediante conjuntos: A= conjunto de alumnos, C= conjunto de

cursos, I= conjunto de matrículas.

• Representando los conjuntos mediante listas enlazadas:

A : Lista [tipo_alumno]C : Lista [tipo_curso]I : Lista [tipo_matrícula]

– La memoria está mejor utilizada, sólo se representan las posiciones con X.

– Las operaciones de consulta requieren recorrer todo el conjunto I: son muy lentas.

tipo_alumno= registroid_alumno: enteronombre: cadena[30]

finregistro

tipo_curso= registroid_curso: enteronombre: cadena[50]

finregistro

tipo_matrícula= registroid_alumno: enteroid_curso: entero

finregistro

Page 36: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 36 Tema 3. Conjuntos.

3.4.2. Listas múltiples.• Una estructura de listas múltiples es una colección de celdas en la que algunas de ellas pueden pertenecer a más de una lista a la vez.• En nuestro caso tenemos:

– Los elementos pueden ser de tres tipos: alumnos, cursos o matrículas.

– Los alumnos forman una lista y los cursos otra.

– Los elementos de matrícula (a, c) pertenecen a dos listas: lista de matriculaciones del alumno a, y lista de matriculaciones del curso c.

– Cada registro de alumno apunta al primer elemento de la lista de matriculaciones de ese alumno.

– Cada registro de curso apunta al primer elemento de la lista de matriculaciones en ese curso.

tipo clase_registro = (alumno, curso, matrícula)tipo_registro = registrocase clase: clase_registro de alumno: (nombre_alumno: cadena[30]; pri_curso, sig_alumno: ^tipo_registro) curso: (nombre_curso: cadena[50]; pri_alumno, sig_curso: ^tipo_registro) matrícula: (a_sig, c_sig: ^tipo_registro)finregistro

Page 37: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 37 Tema 3. Conjuntos.

3.4.2. Listas múltiples.Estructura de listas múltiples

• Las listas de los registros de matrículas son circulares.• Memoria bien utilizada, no hay límite en los conjuntos.• La búsqueda de alumnos en cursos y cursos en alumnos es rápida.

Registros de

alumnos

registros de matrículas

Registros de cursos

Algebra Física A.E.D.

Pepito

Alicia

Dolores

Juan

Juan

nombre_ sig_ pri_

alumno alumno curso

Física

nombre_ pri_ sig_

curso alumno cursoc_sig a_sig

Page 38: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 38 Tema 3. Conjuntos.

3.4.3. Estructuras de datos múltiples.• Una aplicación almacena información sobre determinados objetos. • Necesitamos acceder a los objetos de forma ordenada (según

determinada propiedad de los mismos) y de forma directa (según otra propiedad).

• Ejemplo: Tipo Empleado=registro

Nombre, Direccion: cadena

DNI, sueldo: entero

Telefonos: Lista[entero]

Finregistro

Lista: Lista[Empleado]

– Consulta individual: por DNI, nombre, o teléfono.

– Actualización: insertar, eliminar, o modificar empleado, accediendo por DNI.

– Listado: por DNI, o por sueldo.

Page 39: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 39 Tema 3. Conjuntos.

3.4.3. Estructuras de datos múltiples.• Lista ordenada por sueldo:

– Listado por sueldo O(n)

– Listado por DNI, ordenar la lista, O(n log n)

– Consulta por DNI o nombre, recorrer toda la lista, O(n). Lo mismo actualización.

– Consulta por teléfono, recorrer lista y listas de teléfonos, O(n*t)

• Tabla de dispersión con claves los nombres:– Consulta por nombre, O(1)

– Consulta por DNI, recorrer la tabla, O(B) o O(B*r). Lo mismo actualización.

– Listado por sueldo o DNI, obtener los datos y ordenar, O(B+n log n) o O(B*r+n log n)

– Consulta por teléfono, recorrer lista y listas de teléfonos, O(B+n*t) o O(B*r+n*t)

• Tabla de dispersión con claves los teléfonos:– Acceso rápido por teléfono.

• Árbol binario de búsqueda con claves los DNI:– Listado por DNI, O(n)

– Búsqueda por DNI, O(log n)

Page 40: A.E.D. 1 Tema 3. Conjuntos. Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante.

A.E.D. 40 Tema 3. Conjuntos.

3.4.3. Estructuras de datos múltiples.• Tipo Empleados=registro

ListaSueldos: Lista[Puntero[Empleado]]

HashNombres: TablaHash[cadena,Puntero[Empleado]]

HashTelefonos: TablaHash[entero,Puntero[Empleado]]

ArbolDNI: ArbolBinarioBusqueda[entero,Puntero[Empleado]]

finregistro