Você está na página 1de 38

UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS

FACULTAD DE CIENCIAS MATEMATICAS


ESCUELA DE COMPUTACION CIENTIFICA

FUNCIONES HASH

ALUMNA:
PERALES APAICO, FLOR AMALIA
OBJETIVOS

Definir el concepto de funcin hash


Examinar diversas funciones hash
Examinar el problema de las colisiones en las
tablas de hash
QU SON FUNCIONES HASH?
Es una aplicacin en la que toma como entrada un
mensaje de cualquier tamao y al realizar operaciones
aritmticas y lgicas, consigue otro mensaje de igual
tamao generalmente y muy reducido, por ejemplo
de 128 a 160 bits.
El objetivo consiste, simplemente en desarrollar una
funcin que distribuya de forma razonablemente buena
los elementos dentro de la tabla, de modo que se eviten
las colisiones. Una funcin hash razonable seguir
proporcionando un tiempo de acceso constante (O(1)) al
conjunto de datos.

: = , , ,
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

Implica utilizar nicamente una


parte de la clave o del valor del
elemento con el fin de calcular
la ubicacin en la que hay que
almacenarlo.
METODO DE DIVISIN

Simplemente se utiliza como ndice para cada elemento el


resto de la clave que resulta de dividirla por algn entero
positivo . La funcin podra definirse de la forma siguiente:
Hashcode(key) = Math.abs(key)%
Esta funcin proporciona un resultado en el rango
comprendido entre 0 y . Si utilizamos p como tamao
de la tabla, entonces dispondremos de un ndice que
aplica directamente los elementos sobre las distintas
ubicaciones de la tabla. Utilizar un numero primo como
tamao de la tabla y como divisor permite obtener una
mejor distribucin de los valores de la clave entre las
distintas ubicaciones de la tabla.
MTODO DE PLEGADO
La clave se divide en una serie de partes que luego se
combinan o pliegan para crear el ndice de acceso a la
tabla. Esto se hace dividiendo primero la clave en una
serie de partes, donde cada parte de la clave tendr la
misma longitud que el ndice deseado, excepto
posiblemente la ultima de las claves.
Enel , estas
partes se suman a continuacin para crear el ndice.
Enel , existen diversas variantes
de esta tcnica; sin embargo, generalmente, todas las variantes
implican invertir algunas de las partes de las claves antes de
realizar la suma. Otras variantes de este mtodo utilizan
diferentes algoritmos para determinar que partes de la clave
hay que invertir, tambin puede ser muy til para construir una
funcin hash para una clave que este compuesta por una
cadena de caracteres. Una de las posibles tcnicas consiste en
dividir la cadena de caracteres en una serie de subcadenas de
la misma longitud (en bytes).
METODO DEL CUADRADO MEDIO
La clave se multiplica por si misma y luego se emplea el
mtodo de extraccin para extraer el numero apropiado de
dgitos de la parte central del resultado de la operacin de
elevar al cuadrado, utilizndose esa parte central como
ndice. Deben elegirse cada vez los mismos dgitos
(centrales), con el fin de mantener la coherencia.
Tambin es posible extraer bits en lugar de dgitos y luego
construir el ndice a partir de los bits extrados, puede
utilizarse tambin de manera efectiva con cadena de
caracteres, manipulando las representaciones binarias de los
caracteres que componen la cadena.
METODO DE LA
METODO DE ANALISIS
TRANSFORMACION
DE DIGITOS
BASE

El ndice se forma extrayendo y La


clave se transforma a otra
luego manipulando una serie de base numrica.
dgitos especficos de la clave.
El objetivo es, simplemente,
proporcionar una funcin que
distribuya de forma razonable
las claves entre las distintas
ubicaciones de la tabla.
METODO DEPENDIENTE
DE LA LONGITUD METODO HASHCODE

Laclave y la longitud de la clave La clase java.lang.Object


se combinan de alguna forma define un mtodo denominado
para componer el propio ndice o que devuelve un
un valor intermedio al que luego entero basado en la ubicacin
se aplica alguno de los otros de memoria del objeto. Este
mtodos que hemos presentado valor no resulta, por regla
para formar el ndice. general, muy til. Aunque java
proporcione este mtodo para
Puede usarse tambin de manera
todos los objetos, suele resultar
efectiva con las cadenas de
preferible definir una funcin
caracteres, manipulando las
hash especifica para cada
representaciones binarias de los
clase concreta.
caracteres que componen la
cadena.
TABLAS HASH Qu es?

Es una estructura de datos que se


basan en la asignacin de una clave a
cada elemento para que a travs de
esa clave se pueda acceder de una
manera rpida a dicho elemento. Se
puede hacer las siguientes
operaciones: insercin, eliminacin y
bsqueda.
CARACTERISTICAS:

Estnlimitadas en tamao ya que estn basadas en


arreglos.
Su tamao puede cambiar pero es recomendable
evitar el cambio de tamao.
Sutamao 1 es recomendable que sea un numero
primo
COLISIONES
Qu es?

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

El con este mtodo es


que tiende a crear una serie de
agrupaciones de posiciones
llenas dentro de la tabla, y estas
agrupaciones afectan a la
velocidad de las inserciones y de
las bsquedas.
PRUEBA CUADRATICA
En este mtodo, en lugar de utilizarse una tcnica lineal cuando se
produce una colisin, se produce una formula como:
1
+1 2
= + (1) ( )
2
Para i en el rango comprendido entre 1 y s-1, donde s es el tamao
de la tabla.
El resultado de esta formula es la secuencia de bsqueda p, p+1, p-1,
p+4, p-4, p+9, p-9,Por supuesto, a este nuevo cdigo hash se le aplica
el mtodo de divisin para mantenerlo dentro del rango de la tabla. Al
igual que el mtodo anterior, existe tambin la posibilidad de que
terminemos por volver al cdigo hash original sin haber encontrado una
posicin vaca en la que llevara acabo la insercin.
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

Como m=10(m es el tamao de la tabla)


Si 1 = 1, 2 = 1, , = 13 10

Entonces , = 3
0 7 Como , = 3 , entonces
1 9 insertamos el numero 47 en la
Insertar 47 posicin 3.
2 13
DOBLE HASH
En este mtodo se proporciona una funcin hash secundaria que se
utilizara cuando la funcin hash principal provoque una colisin. Por
ejemplo, si una clave x se corresponde con una posicin p que ya este
ocupada, entonces la siguiente posicin p que probemos estar dada
por:
= +
Si esta nueva posicin tambin esta ocupada, examinamos la posicin:
= + 2 ()
Despus continuamos buscando de esta forma, por supuesto utilizando
el mtodo de divisin para hacer que el ndice se mantenga dentro de los
limites de la tabla, hasta encontrar una posicin vaca. Este mtodo,
aunque es algo mas costoso debido a la introduccin de una funcin
adicional, tiende a reducir las agrupaciones aun mas que el mtodo de
prueba cuadrtica.
EJEMPLO

La ventaja es que incluso


despus de crearse una
agrupacin, esta tendera a
crecer mas lentamente que
si utilizramos los mtodos
anteriores
EJEMPLO
Casilla 0 1 2 3 4 5 6 7 8 9
Elemento 47 32 17 7 27 17 9

, :
, = 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

Você também pode gostar