FUNCIONES HASH
ALUMNA:
PERALES APAICO, FLOR AMALIA
OBJETIVOS
: = , , ,
ALMACENAMIENTO HASH
Con las funciones hash, los elementos se almacenan en una
tabla de hash, estando su ubicacin dentro de la tabla
determinada por dicha funcin. Cada ubicacin de la tabla se
denomina .
Lautilizacin de un almacenamiento de tipo hash hace que el
tiempo de acceso a un elemento concreto sea independiente
al numero de elementos contenidos en la tabla. Esto significa
que todas las operaciones realizadas sobre un elemento de una
tabla hash sern O(1). Con el almacenamiento hash,
simplemente calculamos donde debe encontrarse cada
elemento particular.
Sin embargo esta eficiencia solo puede conseguirse
completamente si cada elemento se asigna a una posicin
distintiva dentro de la tabla.
Una funcin hash que asigne cada elemento a una posicin
univoca de la tabla se denomina .
Otra cuestin relativa es como debe ser de grande la tabla. Si el
conjunto de datos tiene un tamao conocido y se puede utilizar
una funcin hash perfecta, bastara con hacer que la tabla tenga
el mismo tamao que el conjunto de datos. Si no hay disponible
esta funcin o no resulta practico implementarla pero el tamao
del conjunto de datos es conocido, una buena regla practica
consiste en hacer que el tamao de la tabla sea un 150 por ciento
del tamao del conjunto de datos.
Otrocaso bastante comn y muy interesante. Que sucede si
no conocemos el tamao del conjunto de datos? En este
caso, tendremos que utilizar tcnicas de redimensionamiento
dinmico.
de una tabla hash implica
crear nueva tabla hash que sea mayor que la original(quiza
incluso el doble), insertando todos los elementos de la tabla
original en la nueva tabla y luego descartando la tabla
original.
Presentamos diversas tcnicas para desarrollar una funcin hash:
POSICION
METODO DE EXTRACCION
Es la situacin en la que
dos elementos o claves se
asignan a la misma
ubicacin de la tabla.
RESOLUCION
Cuando no resulta posible o practico definir una funcin hash
perfecta, existen diversas formas para tratar las colisiones. De
forma similar, si somos capaces de desarrollar una funcin hash
perfecta para un conjunto de datos concreto, entonces no
necesitamos preocuparnos del tamao de la tabla. En este
caso, simplemente haremos que la tabla tenga un tamao
exactamente igual al del conjunto de datos. Pero en cualquier
otro caso, si el tamao del conjunto de datos es desconocido,
generalmente resulta conveniente hacer que el tamao inicial
de la tabla sea de un 150 porciento del numero esperado de
elementos. Si no se conoce el tamao del conjunto de datos,
ser necesario entonces resolver la cuestin del
redimensionamiento dinmico de la tabla.
ENCADENAMIENTO
Consiste en simplemente tratar conceptualmente la tabla hash como
si fuera una tabla de colecciones, en lugar de ser una tabla de celdas
individuales; cada celda es un puntero a la coleccin asociada en
dicha ubicacin de la tabla. Usualmente, esta coleccin interna se
implementa como una lista desordenada o una lista ordenada.
Puede implementarse de diversas formas:
seria hacer que la matriz que alberga la tabla sea
mayor que el numero de celdas de la tabla y utilizar ese espacio extra
como rea de desbordamiento para almacenar las listas enlazadas
asociadas con cada ubicacin de tabla; cada posicin de la matriz
almacenara tanto un elemento(o una clave) como el ndice (dentro
de la matriz) del siguiente elemento de su lista.
Al utilizar este mtodo, la tabla no puede llegar nunca a
llenarse, pero si se implementa como una matriz, si que puede
llenarse, se requiere decidir si se hace una excepcin o ampliar
la capacidad. En las colecciones anteriores se decidi
expandir la capacidad de la matriz, para este caso, expandir
la capacidad de la matriz dejando la tabla incrustada con su
tamao original tendra un efecto desastroso sobre la
eficiencia. Una solucin consistira en expandir la matriz y la
tabla incrustada en la misma; sin embargo, esto requiere que
todos los elementos de la tabla vuelvan a redistribuirse
utilizando el nuevo tamao de la tabla.
consiste en utilizar enlaces; cada celda o
franja de la tabla hash seria similar a la clase que
hemos utilizado para construir listas enlazadas. De esta forma,
al asignar un segundo elemento a una celda concreta,
simplemente creamos un nuevo objeto en ,
hacemos que la referencia del nodo existente apunte al
nuevo nodo, hacemos que la referencia del nuevo
nodo apunte al elemento que se esta insertando y hacemos,
finalmente, que la referencia del nuevo nodo tenga un
valor nulo.
consiste en hacer, literalmente que cada
posicin de la tabla sea un puntero a una coleccin,. De esta
forma, podemos representar cada posicin de la tabla
mediante una lista o, quizs alguna otra coleccin mas
eficiente(por ejemplo, un rbol de bsqueda binaria
equilibrado), lo cual nos permitira mejorar el caso peor.
Recuerde, sin embargo, que si la funcin hash distribuye
razonablemente los elementos entre las distintas ubicaciones
de la tabla, esta tcnica puede requerir una gran cantidad
de trabajo de procesamiento adicional ofreciendo una
mejora muy pequea.
FACTOR DE CARGA
Tambinllamada densidad de carga, , al cociente entre el
numero de claves en uso y el numero total de registros
almacenables en la tabla.
=
Donde n, es el numero de claves y m es el tamao de la tabla.
Sirve para la eficiencia de la tabla hash.
El rango de valores de este factor de carga ser ; , es decir si
superamos a 1( 100%), hacemos el (se refiere a la
ampliacin de la tabla y calcular otra vez la funcin hash).
DIRECCIONAMIENTO ABIERTO
Consiste en la bsqueda de otra
posicin vaca de la tabla, distinta de
aquella a la que corresponda el
elemento originalmente. Existen varios
mtodos para encontrar otra
ubicacin disponible dentro de la
tabla. Vamos a examinar tres de estos
mtodos:
Prueba lineal
Prueba cuadrtica
Doble hash
PRUEBA LINEAL
Es el mas simple de los mtodos. Con este mtodo, si a un
elemento le corresponde la posicin p y dicha posicin ya esta
ocupada, simplemente probamos con la posicin (p+1)%s,
donde s es el tamao de la tabla. Si la posicin (p+1)%s ya esta
ocupada, probamos con la posicin (p+2)%s, y as
sucesivamente, hasta encontrar una posicin vaca o volver a
la posicin original. Si se encuentra una posicin vaca, se
inserta en ella el nuevo elemento. Lo que hay que hacer
cuando no se encuentra ninguna posicin vaca es una
decisin de diseo que debe tomarse a la hora de crear una
tabla hash, una posibilidad consiste en generar una excepcin
si la tabla esta llena; la otra posibilidad es expandir la
capacidad de la tabla y volver a redistribuir las entradas
existentes.
EJEMPLO
La ventaja es que no
tiene una tendencia tan
grande a crear
agrupaciones como el
mtodo de prueba lineal.
EJEMPLO
Casilla 0 1 2 3 4 5 6 7 8 9
Elemento 32 47 14 27 17 9
, :
, = + 1 + 2 2
=
: , 0.
1 2
, :
, = 1 + 2
1 , 2 .
0.
1 = 10 = 7
Insertar 7 0
2 = 1 + 9 = 8
1
Entonces 7,1 = 7 + 1 8 10 = 5
Se insertara al numero 7 en la posicin 5.
BORRADO DE ELEMENTOS EN UNA TABLA HASH
CASO 1 CASO 2
El elemento que estamos tratando de
El elemento que estamos
eliminar esta almacenado en la tabla (no en
tratando de eliminar es el
el rea de desbordamiento) pero tiene un
nico que se ha asignado
ndice que apunta al rea de
a una ubicacin concreta
desbordamiento y que indica el siguiente
de la tabla.
elemento almacenado en la misma posicin.
CASO 3 CASO 4
El elemento que estamos El elemento que estamos CASO 5
tratando de eliminar se tratando de eliminar se El elemento que estamos
encuentra situado al final encuentra en mitad de la tratando de eliminar no se
de la lista de elementos lista de elementos encuentra en la lista.
almacenados en dicha almacenados en dicha
ubicacin de la tabla. ubicacin de la tabla.
Si hemos decidido implementar nuestra tabla hash utilizando una
implementacin de direccionamiento abierto, el proceso borrado
resulta mas complicado.
La solucin a este problema consiste en marcar los elementos como
borrados, pero sin eliminarlos de la tabla hasta algn momento
posterior en el que el elemento borrado sea sobreescrito por algn
nuevo elemento insertado o vuelva a redistribuirse la tabla
completa, bien porque la estemos expandiendo o bien porque se
alcance algn umbral predeterminado relativo al porcentaje de
registros borrados de la tabla. Esto significa que necesitamos aadir
un indicador de tipo boolean a cada nodo de la tabla y modificar
todos nuestros algoritmos para que comprueben y/o manipulen
dicho indicador.
WEBGRAFIA
https://www.youtube.com/watch?v=WnLdu8OHA3Q&t=1s
https://www.youtube.com/watch?v=gYBnEDIn054
https://www.youtube.com/watch?v=ovBzY1LjaFo