Вы находитесь на странице: 1из 45

UNIDAD 2.

ESTRUCTURA DE DATOS AVANZADA


2.1 Conceptos de conjuntos y sus operaciones
CONJUNTOS
Es una coleccin de miembros (o elementos); cada
miembro de un conjunto, o un elemento primitivo que
recibe el nombre de tomo.
Relacin de conjuntos
B
A
A
B
1
7
5 3
9
2
4
8
6
c A B
TDA CONJUNTO: OPERACIONES MS
COMUNES
A, B, C y S conjuntos; x de tipo elemento
Unin (A, B, C) C:= A B
Interseccin (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 e A. Falso si x e 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
IMPLEMENTACIN DE TDA CONJUNTO
Dos tipos de implementaciones bsicas:
Mediante arreglos de booleanos.
Mediante listas enlazadas.
La mejor implementacin (en trminos de eficiencia)
depende del uso que hagamos de los conjuntos:
Operaciones ms frecuentes.
Tamao y variabilidad de los conjuntos usados.
5
8
1
3
1 2 3 4 5 6 7 8 9 10
1 0 1 0 1 0 0 1 0 0
C:
Conjunto
8
Lista de elementos
1 3 5
Arreglo de booleanos
IMPLEMENTACIN CON ARREGLOS 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 conjunto universal.
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
1 0 1 1 1 0 1
A: Conjunto[a..g]
a b c d e f g
0 0 1 0 1 1 1
B: Conjunto[a..g]
Unin, interseccin, diferencia: se transforman en las
operaciones booleanas adecuadas.
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]
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
VENTAJAS Y DESVENTAJAS EN ARREGLOS
BOOLEANOS
Ventajas:
Operaciones muy sencillas de implementar. Se pueden
realizar sin necesidad de usar memoria dinmica.
Miembro, Inserta y Suprime tienen un tiempo constante.
Unin, Interseccin y Diferencia se pueden realizar en un
tiempo proporcional al tamao del conjunto universal.
Si el conjunto universal es tan pequeo como el nmero de
bits de una palabra de la mquina, las operaciones
anteriores se pueden realizar con una simple operacin
lgica.
Desventajas:
Utiliza espacio proporcional al tamao del conjunto universal.
El conjunto universal no puede ser muy grande ni infinito.
Cada elemento debe tener un ndice (Que pasa si tenemos
cadenas?).
IMPLEMENTACIN CON LISTAS ENLAZADAS
Idea: Guardar en una lista los elementos del conjunto.
Definicin:
tipo Conjunto[Tipo ] = Lista[Tipo];
Ventajas:
Utiliza espacio proporcional al tamao del conjunto representado (no
al conjunto universal).
El conjunto universal puede ser muy grande, o incluso infinito.
Desventajas:
Operaciones ms complejas de implementar.
Utiliza ms recursos si el conjunto est muy lleno.
Algunas operaciones son menos eficientes.
C = {1, 5, 8, 3}
8 1 3 5 C:
Conjunto[T]
IMPLEMENTACION MEDIANTE LISTAS
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
IMPLEMENTACIN CON LISTAS
Listas no ordenadas.
Listas ordenadas.
Miembro, Inserta, Suprime: Parar si encontramos
un elemento mayor que el buscado.
Unin, Interseccin, Diferencia: Recorrido
simultneo (y nico) de ambas listas.
8 1 3 5
C: Conjunto[T]
1 3 5
8
C: Conjunto[T]
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
Cunto es el tiempo de ejecucin ahora?
1 3 5 8
C: Conjunto[T]
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 NOT 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
Implementaciones bsicas
Conclusiones
Arreglos de booleanos: muy rpida para las
operaciones de insercin y consulta.
No viable 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.
2.2 TDA DICCIONARIO
Concepto, operaciones, ventajas y desventajas
El TDA diccionario
En muchas aplicaciones necesitamos guardar datos de un conjunto
de elementos, que pueden variar en tiempo de ejecucin.
P. ej.: agenda electrnica, diccionario de sinnimos, base de datos
de empleados, notas de alumnos, etc.
Particularidades:
Los datos se guardan en un slo sitio, no siendo necesarias las
operaciones de unin, interseccin o diferencia, pero s insertamos,
consultamos y modificaciones.
Cada elemento tiene una clave, y asociado a ella se guardan una serie
de valores.
Las operaciones de consulta son por clave.
Definicin: Una asociacin es un par
(clave: tipo_clave, valor: tipo_valor).
Definicin: Un diccionario es un conjunto de asociaciones, con
las operaciones Inserta, Suprime, Miembro y Anula.
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])
Crear (var D: Diccionario[tcl,tval])
El TDA diccionario
548
Julio
7,7
clave
valor
El TDA diccionario
Todo lo dicho sobre implementacin de conjuntos se puede aplicar (extender)
a diccionarios.
Implementacin:
Con arreglos 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
El TDA 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
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
El TDA diccionario
2.3. TABLAS DE HASH O
DISPERSIN
Conceptos
Las tablas de dispersin
La representacin de conjuntos o diccionarios con
listas o arreglos tiene un tiempo de O(n), para
Inserta, Suprime y Miembro, con un uso
razonable de memoria.
Con vectores de bits el tiempo es O(1), pero tiene
muchas limitaciones de memoria.
Cmo aprovechar lo mejor de uno y otro tipo?
Las tablas de dispersin
Idea: reservar un tamao fijo, un array T con M posiciones (0, ..., M-1).
Dada una clave k (sea del tipo que sea) calcular la posicin donde colocarlo,
mediante una funcin h.
0
1
2
.
.
.
M-1
T: array [0..M-1]
Claves
h
k
Las tablas de dispersin
Funcin de dispersin (hash): h
h : tipo_clave [0, , M-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
Las tablas de dispersin
El tipo del elemento no est restringido. Si es un registro, podemos
tomar uno de sus campos como clave, y aplicar la funcin sobre l.
Funcin de dispersin: h: Clave [0, ..., M-1]
Tamao de la tabla M: aproximadamente sobre el nmero de
elementos de los conjuntos (normalmente, M << rango de claves).
Qu ocurre si para dos claves distintas k
1
, k
2
, ocurre que h(k
1
) =
h(k
2
)?
Definicin: Si (k
1
= k
2
) . (h(k
1
) = h(k
2
)) entonces se dice que k
1
, k
2
son
sinnimos.
Los distintos mtodos de dispersin difieren en el tratamiento de los
sinnimos. Tipos de dispersin:
Dispersin abierta.
Dispersin cerrada.
Dispersin abierta
Las celdas de la tabla no son elementos (o asociaciones), sino listas de
elementos, tambin llamadas cubetas.
tipo TablaHash[T]= array [0..M-1] de Lista[T]
Sea M= 10, D= {9, 25, 33, 976, 285, 541, 543, 2180}
0 1 2 3 4 5 6 7 8 9 T: Tabla-
Hash[T]
9 25 33
285
541
543
976 2180
Dispersin abierta
La tabla de dispersin est formada por M 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 M cubetas y n elementos en la tabla.
Si todos los elementos se reparten uniformemente cada cubeta ser de
longitud: 1 + n/M
Dispersin abierta
Tiempo de Inserta, Suprime, Consulta: O(1+n/M)
Ojo: qu ocurre si la funcin de dispersin no reparte bien los elementos?
Utilizacin de memoria
Si 1 puntero = p
1
bytes, 1 elemento = p
2
bytes.
En las celdas: (p
1
+ p
2
)n
En la tabla: p
1
M
Conclusin:
Menos cubetas: se gasta menos memoria.
Ms cubetas: operaciones ms rpidas.
Dispersin cerrada
Las celdas del array son elementos del diccionario (no listas). No se
ocupa un espacio adicional de memoria en listas.
tipo TablaHash[ tc, tv ]= array [0..M-1] de (tc, tv)
Si al insertar un elemento nuevo k, ya est ocupado h(k), se dice que
ocurre una colisin.
En este caso ser necesario hacer redispersin: buscar una nueva
posicin para meter el elemento.
Redispersin: si falla h(k), aplicar h
1
(k), h
2
(k), ... hasta encontrar una
posicin libre.
Redispersin lineal: h
i
(k)= (h(k) + i) mod M
La secuencia de posiciones recorridas para un elemento se suele
denominar cadena o secuencia de bsqueda.
0 1 2 3 4 5 6 7 8 9
2180 541 33 543 285 976 25 9
Dispersin cerrada
Consulta (k, D):
Examinar la posicin h(k).
Si x est en la posicin h(k), entonces devolver Verdad (o Tabla[h(k)].valor).
Si est vaca, entonces no es miembro; devolver Falso.
En otro caso, la posicin est ocupada pero por otro elemento. Debemos
examinar las posiciones h
1
(k), h
2
(k), ... y as sucesivamente hasta encontrar k,
vaco o examinar toda la tabla.
Consulta (clave, T): valor
x:= h(clave)
i:= 0;
mientras T[x].clave clave AND T[x].clave VACIO
AND i<M hacer
i:= i + 1
x:= h
i
(clave)
finmientras
si T[x].clave == clave entonces
devolver T[x].valor
sino devolver NULO
Dispersin cerrada
Cmo sera la insercin?
Y la eliminacin?
Ojo con la eliminacin.
Ejemplo: eliminar 976 y luego consultar 285.
0 1 2 3 4 5 6 7 8 9
2180 541 33 543 25 976 285 9
285
Resultado: 285 no est en la tabla!!
Dispersin cerrada
Conclusin: 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.
0 1 2 3 4 5 6 7 8 9
2180 541 33 543 25 976 285 9
285
Resultado: Encontrado 285 en la tabla!!
OJO
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 1 2 3 4 5 6 7 8 9
2180 541 33 25 976 9 285 543
Dispersin cerrada
Utilizacin de memoria en dispersin cerrada
Si 1 puntero = p
1
bytes, 1 elemento = p
2
bytes.
Memoria en la tabla: p
2
M
O bien: p
1
M + p
2
n
En dispersin abierta tenamos:
p
1
M + (p
1
+ p
2
)n
Cul es mejor?
Eficiencia de las operaciones
La tabla nunca se puede llenar con ms de M elementos.
La probabilidad de colisin crece cuantos ms elementos hayan,
disminuyendo la eficiencia.
El costo de Inserta es O(1/(1-n/M))
Cuando N M, el tiempo tiende a infinito.
En dispersin abierta tenamos: O(1+n/M)
Dispersin cerrada
1/(1-n/M)
1+n/M
n/M= fraccin ocupada de la tabla, tiempo para buscar en ella
1 tiempo necesario para hallar la cubeta
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, M, reestructurar.
Dispersin abierta: reestructurar si n > 2 M
Dispersin cerrada: reestructurar si n > 0.75 M
Funciones de dispersin
Propiedades de una buena funcin de dispersin
La funcin debe minimizar el nmero de
sinnimos: debe ser lo ms aleatoria posible y
repartir los elementos en la tabla de manera
uniforme.
La funcin debe ser fcil de calcular (buscamos
eficiencia).
Ojo: h(k) es funcin de k, devuelve siempre el
mismo valor para un mismo valor de k.
Funciones de dispersin
Ejemplos de funciones de dispersin
Sea la clave k un entero.
Mtodo de la multiplicacin.
h(k) = (((A/w)k)mod 1)M; con w tamao palabra y
A constante entera prima con w
Mtodo de divisin.
h(k) = k mod M;
Mtodo del centro del cuadrado.
h(k) = k
2
/ 100 mod M
h(k)= k
2
/ C mod M
Escoger un C, tal que MC
2
~ K
2
, para k en el intervalo (0, ..., K).
Ej.: K= 1000; M= 8; C=354; h(456)= 3
Funciones de dispersin
Sea la clave k= x
1
x
2
x
3
x
4
x
5
x
6
un entero o cadena.
Mtodo de plegado (folding).
h(k) = (x
1
x
2
+ x
3
x
4
+ x
5
x
6
) mod M
h(k) = (x
3
x
2
x
1
+ x
6
x
5
x
4
) mod M
Mtodo de extraccin.
h(k) = (x
4
x
1
x
6
) mod M
Combinacin de mtodos.
h(k) = (x
4
x
1
x
6
)
2
/ D + C(x
3
x
5
x
2
) mod M
h(k) = (C1x
2
mod C2 + xC3) mod M

Funciones de redispersin
Redispersin lineal.
h
i
(k) = h(i, k) = (h(k) + i) mod M
Es sencilla de aplicar.
Se recorren todas las cubetas para i= 1, , M-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 . . . . M-2 M-1
Funciones de redispersin
Redispersin con saltos de tamao C.
h
i
(k) = h(i, k) = (h(k) + Ci) mod M
Es sencilla de aplicar.
Se recorren todas las cubetas de la tabla si C y M son primos entre s.
Inconveniente: no resuelve el problema del agrupamiento.
Redispersin cuadrtica.
h(i, k) = (h(k) + D(i)) mod M
D(i) = (+1, -1, +2
2
, -2
2
, +3
2
, -3
2
, )
Funciona cuando M= 4q + 3, para q e N
Resuelve el problema del agrupamiento?
Funciones de redispersin
Redispersin doble.
h(i, k) = (h(k) + C(k)i) mod M
Idea: es como una redispersin con saltos de tamao C(k), donde el tamao
del salto depende de k.
Si M es un nmero primo, C(k) es una funcin:
C : tipo_clave [1, , M-1]
Se resuelve el problema del agrupamiento si los sinnimos (con igual valor h(k))
producen distinto valor de C(k).
Ejemplo. Sea k = x
1
x
2
x
3
x
4
h(k) = x
1
x
4
mod M
C(k) = 1 + (x
3
x
2
mod (M-1))
Las tablas de dispersin
Conclusiones:
Idea bsica: la funcin de dispersin, h, dice
dnde se debe meter cada elemento. Cada k va a
la posicin h(k), 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.?
REFERENCIA
Aho A, Hopcroft J, Ullman J, Estructuras de datos y
algoritmos. Captulo 4 pg. 107-135. Adison-Wesley
Iberoamericano, S.A. 1998.
Estructura de datos
www.slidefinder.net/p/parte_estructuras_datos_tema_conjuntos/.../p2

Вам также может понравиться