Você está na página 1de 28

UNIVERSIDAD CENTRAL DEL ECUADOR

FACULTAD DE INGENIERA CIENCIAS FSICAS Y


MATEMTICAS
BSQUEDA POR TRANSFORMACIN DE CLAVES (HASH)
DOCENTE: Wagner Lucero
GRUPO: NO A LA SEGUNDA MATRICULA
AUTORES:
Jennifer Bedn (coordinadora)
Jean Gomez (comunicador)
Jeniffer Guaman (relatora)
Henry Lagla (viga de tiempo)
Edison Macas (utilero)

PARALELO: 10

Quito, Febrero 10 del 2015

Contenido
INTRODUCCIN.............................................................................................. 3
OBJETIVOS...................................................................................................... 4
Objetivo general:..................................................................................... 4
Objetivos especficos:............................................................................. 4

BSQUEDA POR TRANSFORMACIN DE CLAVES (HASH)................................5


1.1 ALGORITMO HASHING......................................................................5
1.2 TABLAS HASH..................................................................................... 6
1.2.1 Tipos de Tablas Hash.................................................................8
1.3 MTODOS DE TRANSFORMACIN DE CLAVES...............................9
1.3.1 Funcin Mdulo (Por Divisin)...............................................10
1.3.2 Funcin Cuadrado.....................................................................11
1.3.3 Funcin Plegamiento..............................................................11
1.3.3 Truncamiento............................................................................ 12
1.4 MTODOS DE TRATAMIENTO DE COLISIONES.............................13
1.4.1 Reasignacin............................................................................. 14
1.4.2 Arreglos Anidados....................................................................20
1.4.3 Encadenamiento.......................................................................21
IMPLEMENTACIN DEL MTODO HASH EN JAVA................................23
IMPLEMENTACIN DEL MTODO HASH EN C++................................26
HERRAMIENTAS PARA REALIZAR EL VIDEO........................................28
CONCLUSIONES...................................................................................... 29
RECOMENDACIONES.............................................................................. 29
BIBLIOGRAFIA......................................................................................... 30

INTRODUCCIN
El mtodo hash consiste en facilitar la forma de encontrar los datos en los arreglos En
consecuencia, las aplicaciones h(k), a las que desde ahora llamaremos funciones hash,
tienen la particularidad de que podemos esperar que h( ki ) = h( kj ) para bastantes pares
distintos ( ki,kj ). El objetivo ser pues encontrar una funcin hash que provoque el menor
2

nmero posible de colisiones (ocurrencias de sinnimos), aunque esto es solo un aspecto


del problema, el otro ser el de disear mtodos de resolucin de colisiones cuando stas
se produzcan.
Se trata de abordar de forma sencilla este concepto para aquellos que no lo conozcan.
Podemos decir que un HASH no es ms que un nmero o resumen. De hecho, esta es solo
una herramienta ms que se puede implementar a los arreglos, se puede decir que un
fichero es como un flujo de bits y le aplicamos un algoritmo de HASH lo que obtenemos es
otro conjunto de bits (de longitud fija y que depende del nmero de bits de salida del
algoritmo o funcin que utilicemos) que depende bit a bit del contenido del flujo original
de
bits
que
sirvi
como
entrada
al
algoritmo.
Adems, cumplen las siguientes propiedades:
Todos los Hashes generados con una funcin de hash tienen el mismo tamao, sea cual
sea el mensaje utilizado como entrada.
Dado un mensaje, es fcil y rpido mediante un ordenador calcular su HASH.
Es imposible reconstruir el mensaje original a partir de su HASH.
Es imposible generar un mensaje con un HASH determinado.
Es decir, un algoritmo de HASH no es un algoritmo de encriptacin, aunque s se utiliza en
esquemas de cifrado, como algoritmos de cifrado asimtrico (por ejemplo en el RSA).

OBJETIVOS
Objetivo general:
Adquirir conocimientos sustentables acerca de la Bsqueda por Transformacin de Claves
(Hash) mediante el uso de la memoria tcnica que dar al estudiante facilidad para
comprender este mtodo de bsqueda, y as los estudiantes puedan resolver problemas
donde ser necesario utilizar los conocimientos adquiridos.

Objetivos especficos:
Conocer los mtodos que utiliza la Bsqueda por Transformacin de Claves (Hash) y
aplicarlos en algoritmos.
Realizar algoritmos de bsqueda en los diferentes lenguajes estudiados que son: C++,
Visual Basic y Java.
Realizar presentaciones en Prezi y Power Point.
Realizar un video tutorial sobre este mtodo de bsqueda y subirlo a YouTube.

BSQUEDA POR TRANSFORMACIN DE CLAVES (HASH)


Este mtodo permite asignar a un valor una posicin determinada de un arreglo y de igual
forma permite recuperarla fcilmente, igualmente convierte una clave dada en una
direccin (ndice), dentro del arreglo.
Adems gracias a que no hay necesidad de tener los elementos ordenados aumenta la
velocidad de bsqueda. Cuenta tambin con la ventaja de que el tiempo de bsqueda es
prcticamente independiente del nmero de componentes del arreglo.
Para trabajar con este mtodo de bsqueda debe elegirse previamente:
1. Una funcin hash que sea fcil de calcular y que distribuya uniformemente las
claves.
2. Un mtodo para resolver colisiones. Si estas se presentan se debe contar con algn
mtodo que genere posiciones alternativas
Uso de funciones Hash:

1. Proteger la confidencialidad de una contrasea


2. Garantizar la integridad de los datos
3. Verificar la identidad del emisor de un mensaje mediante firmas digitales
La eficiencia de una funcin Hash depende de:
1. La distribucin de los valores de llave o clave que realmente se usan.
2. El nmero de valores de llave o clave que realmente estn en uso con respecto al
tamao del espacio de direcciones.
3. El nmero de registros que pueden almacenarse en una direccin dada sin causar
una colisin.
4. La tcnica usada para resolver el problema de las colisiones.

1.1 ALGORITMO HASHING


Algoritmo que se utiliza para generar un valor de Hash para algn dato, como por ejemplo
claves. Un algoritmo de Hash hace que los cambios que se produzcan en los datos de
entrada provoquen cambios en los bits del Hash. Gracias a esto, los Hash permiten
detectar si un dato ha sido modificado. (Vilugron, 2014)

Ventajas

Desventajas

Se
pueden
usar
los
valores
naturales de la llave, puesto que se
traducen
internamente
a
direcciones fciles de localizar.

No pueden usarse
longitud variable.

Se logra independencia lgica y


fsica, debido a que los valores de
las llaves son independientes del
espacio de direcciones.

registros

de

El archivo no est clasificado.


No permite claves repetidas.
Solo permite acceso por una sola
llave.

No se requiere almacenamiento
adicional para los ndices.

Costos
Tiempo de procesamiento requerido para la aplicacin de la funcin Hash.
Tiempo de procesamiento y los accesos E/S requeridos para solucionar las
colisiones.

1.2 TABLAS HASH


5

Robert Sedgewick y Kevin Wayne mencionan en su obra Algorithms, 4th Edition


que:
If keys are small integers, we can use an array to implement a symbol table, by
interpreting the key as an array index so that we can store the value associated with key i
in array position i. In this section, we consider hashing, an extension of this simple method
that handles more complicated types of keys. We reference key-value pairs using arrays
by doing arithmetic operations to transform keys into array indices.
Search algorithms that use hashing consist of two separate parts. The first step is to
compute a hash function that transforms the search key into an array index. Ideally,
different keys would map to different indices. This ideal is generally beyond our reach, so
we have to face the possibility that two or more different keys may hash to the same
array index. Thus, the second part of a hashing search is a collision-resolution process that
deals with this situation.
Hash functions. If we have an array that can hold M key-value pairs, then we need a
function that can transform any given key into an index into that array: an integer in the
range [0, M-1]. We seek a hash function that is both easy to compute and uniformly
distributes the keys.
Basado en lo expuesto anteriormente se destaca la importancia de las tablas hash ya que
sin ellas no se podra utilizar el Mtodo Por transformacin de claves; adems facilitan la
clasificacin de la informacin dada permitiendo que la bsqueda sea rpida y efectiva,
finalmente se puede decir que una tabla bien estructurada evitara que existan excesivas
colisiones.
Las tablas hash son estructuras tipo vector que ayudan a asociar claves con valores o
datos.
Observacin:
No se debe buscar directamente el valor deseado, sino a travs de una funcin de
dispersin h(x) localizar la posicin del valor buscado. (Olmos, 2014)
Una tabla hash se construye con tres elementos bsicos:
1. Un vector capaz de almacenar m elementos
2. Funcin de dispersin que permita a partir de los datos (llamados clave) obtener el
ndice donde estar el dato en el arreglo
3. Una funcin de resolucin de colisiones

Olmos, (2014). Tablas hash. Recuperado de

Para el diseo de una tabla hash, es de gran importancia cumplir con lo siguiente:

Funcin sencilla para una evaluacin rpida


Distribuir uniformemente en el espacio de almacenamiento
Evitar (si es posible) la aparicin de sinnimos o colisiones
Para dos claves similares, generar posiciones distantes

1.2.1 Tipos de Tablas Hash


Existen diferentes tipos de tablas hash:

Tablas de direccin directa: cuando el universo


de objetos
U es relativamente pequeo
Elemento con llave k almacenado en el slot k

Tablas de direccin indirecta: Cuando el


universo de objetos U es muy grande, se crea un
vector T de dimensin m, tal que |U| > m
Elemento con llave k almacenado en el slot h(k)
|U| > m ki, kj U: h(ki) = h(kj) COLISIONES

1.3 MTODOS DE TRANSFORMACIN DE CLAVES


Existen numerosos mtodos de transformacin de claves. Todos ellos tienen en comn la
necesidad de convertir claves en direcciones.
Cuando se desea localizar un elemento de clave x, el indicador de direcciones indicar en
qu posicin del array estar situado el elemento.

1.3.1 Funcin Mdulo (Por Divisin)


Se lo utiliza cuando la distribucin de los valores de claves no es conocida.
La funcin de este mtodo es dividir el valor de la clave entre un nmero apropiado, y
despus utilizar el residuo de la divisin como direccin relativa para el registro. (Castro,
2014)

Suponga que se tiene un arreglo de N elementos y K es la clave del dato a buscar.


La funcin hash queda:
H (k) = (K mod N) +1
Para lograr una mayor uniformidad en la distribucin, N debe ser un nmero primo. (El
nmero primo prximo a N)
Existen varios factores que deben considerarse para seleccionar el divisor:
divisor > n: suponiendo que solamente un registro puede ser almacenado en una
direccin relativa dada.
Seleccionarse el divisor de tal forma que la probabilidad de colisin sea minimizada.
Por ejemplo:
Sea N=100, el tamao del arreglo
Sus direcciones de 1-100.
Sea K1 = 7259
K2 = 9359
Dos claves que deban asignarse posiciones en el arreglo
H (K1) = (7259 mod 100) +1=60
H (K2) = (9359 mod 100) +1=60
Donde H (K1) es igual a H (K2) y K1 es distinto de K2, es una colisin
Se aplica N igual a un valor primo en lugar de utilizar N=100
H (K1) = (7259 mod 97) +1=82
H (K2) = (9359 mod 97) +1=48
Con N=97 se ha eliminado la colisin

1.3.2 Funcin Cuadrado


Consiste en elevar al cuadrado la clave y tomar los dgitos centrales como direccin. El
nmero de dgitos a tomar queda determinado por el rango del ndice. Sea K la clave del
dato buscar. (Takeyas, 2012)
9

La funcin hash queda definida por la siguiente frmula:


H (K) = dgitos_centrales (K2) + 1
La suma de una unidad a los dgitos centrales es para obtener un valor entre 1 y N.
El siguiente ejemplo presenta un caso de funcin hash cuadrado: Sea N= 100 el tamao
del arreglo, y sean sus direcciones los nmeros entre 1 y 100.
Sean K1 = 186 y K2 = 581 dos claves a las que deban asignarse posiciones en el arreglo.
Se aplica la frmula anterior para calcular las direcciones correspondientes a K1 y a K2.
K12 = 186^2 = 03 45 96
K22 = 581^2 = 33 75 61
H (K1) = dgitos_centrales (03 45 96) + 1 = 46
46 sera la direccin correspondiente
H (K2) = dgitos_centrales (33 75 61) + 1 = 76
76 sera la direccin correspondiente
Como el rango de ndices en nuestro ejemplo, vara de 1 a 100 se toman solamente los
dos dgitos centrales del cuadrado de las claves.

1.3.3 Funcin Plegamiento


Consiste en dividir la clave en partes de igual nmero de dgitos (la ltima puede tener
menos dgitos) y operar con ellas, tomando como direccin los dgitos menos
significativos. La operacin entre las partes puede hacerse por medio de sumas o
multiplicaciones. Sea K la clave del dato a buscar. (Takeyas, 2012)
K est formada por los dgitos d1, d2,..., dn. La funcin hash queda definida por la
siguiente frmula:
H (K) = dgmensig ((d1... di) + (di+1... dj) +... + (dl... dn)) + 1
Dgnense: dgitos menos significativos
El operador que aparece en la frmula operando las partes de la clave es el de suma. Pero
puede ser el de la multiplicacin. La suma de una unidad a los dgitos menos significativos
(dgmensig) es para obtener un valor entre 1 y N.
Ejemplo: Sean N = 100 el tamao del arreglo, y sean sus direcciones los nmeros entre 1
y 100. Sean K1 = 280304 y K2 = 484001 dos claves a las que deban asignarse posiciones

10

en el arreglo. Se aplica la anterior frmula para calcular las direcciones correspondientes a


K1 y K2.
H (K1) = dgmensig (28 + 03 + 04) + 1 = dgmensig (35) + 1 = 36
H (K2) = dgmensig (48 + 40 + 01) + 1 = dgmensig (81) + 1 = 82
De la suma de las partes se toman solamente dos dgitos porque los ndices del arreglo
varan de 1 a 100.

1.3.3 Truncamiento
El truncamiento consiste en tomar algunos dgitos de la clave y con estos formar una
posicin en un array. Se ignora parte de la clave para con el resto formar un ndice de
almacenamiento.
La idea consiste en tener un listado de nmeros, seleccionar por ejemplo la posicin 2, 4 y
5; para as tener una posicin en donde poder almacenar la clave. Llevando esto a un
ejemplo prctico:

5700931

703

3498610

481

0056241

064

9134720

142

5174829

142

Lo positivo del truncamiento y una de las ventajas por sobre otros mtodos de bsqueda y
ordenamiento es que no solo funciona con valores numricos, tambin funciona con
caracteres alfabticos, esto se puede aplicar de dos formas:

1) Transformar cada carcter en un nmero asociado a su posicin en el abecedario.


2) Transformar cada carcter en un nmero asociado a su valor segn el cdigo ASCII.
Una vez obtenida la clave en forma numrica, se puede utilizar normalmente.
La eleccin de los dgitos a considerar es arbitraria, pueden tomarse posiciones pares o
impares. Luego se les puede unir de izquierda a derecha o de derecha a izquierda.
La funcin queda definida por:
H (K)=dgitos (t1 t2 t3 tn)+1

11

Existen casos en los que a la clave generada se les agrega una unidad, esto es para los
casos en el que el vector de almacenamiento tenga valores entre 1 y el 100, as se evita
la obtencin de un valor 0.

H (K1)=dgitos (7 2 5 9)+1=76
H (K2)=dgitos (9 3 5 9)+1=96

Una de las principales desventajas de utilizar truncamiento y en s el mtodo de hashing


es que dos o ms claves pueden tomar una misma posicin dentro de la tabla de hash, a
esto es a lo que se le llama Colisin. Cuando hay colisiones se requiere de un proceso
adicional para encontrar la posicin disponible para la clave, lo cual disminuye la
eficiencia del mtodo. (Guzmn, 2014)

1.4 MTODOS DE TRATAMIENTO DE COLISIONES


La eleccin de un mtodo adecuado para resolver colisiones es tan importante como la
eleccin de una buena funcin hash. Cuando la funcin hash obtiene una misma direccin
para dos claves diferentes, se est ante una colisin.

Algunos mtodos ms utilizados para resolver colisiones son los siguientes:

Reasignacin

Arreglos anidados

reas de desborde

1.4.1 Reasignacin
Existen varios mtodos que trabajan bajo el principio de comparacin y reasignacin de
elementos. Se analizaran tres de ellos:

Prueba lineal

Prueba cuadrtica

Doble direccin hash

1.4.1.1 Prueba Lineal


Consiste en que una vez detectada la colisin se debe de recorrer el arreglo
secuencialmente a partir del punto de colisin, buscando al elemento. El proceso de
bsqueda concluye cuando el elemento es hallado, o bien cuando se encuentra una

12

posicin vaca. Se trata al arreglo como a una estructura circular: el siguiente elemento
despus del ltimo es el primero.
La principal desventaja de este mtodo es que puede haber un fuerte agrupamiento
alrededor de ciertas claves, mientras que otras zonas del arreglo permaneceran vacas. Si
las concentraciones de claves son muy frecuentes, la bsqueda ser principalmente
secuencial perdiendo as las ventajas del mtodo hash. (Takeyas, 2012)
Con el ejemplo se ilustra el funcionamiento del algoritmo:

1.4.1.2 Prueba Cuadrtica


(Takeyas, 2012). Administracin de archivos [Prueba Cuadrtica]. Recuperado de

Este mtodo es similar al de la prueba lineal. La diferencia consiste en que en el


cuadrtico las direcciones alternativas se generan como D + 1, D + 4, D + 9,. . ., D + i en
vez de D + 1, D + 2,..., D + i. La principal desventaja de este mtodo es que pueden
Colisiones.PDF
quedar casillas del arreglo sin visitar. (Takeyas, 2012)
Adems, como los valores de las direcciones varan en 1 unidades, resulta difcil
determinar una condicin general para detener el ciclo. Este problema podra solucionarse
empleando una variable auxiliar, cuyos valores dirijan el recorrido del arreglo de tal
manera que garantice que sern visitadas todas las casillas. A continuacin se presenta
un ejemplo que ilustra el funcionamiento:

(Takeyas, 2012). Administracin de archivos [Prueba Cuadrtica]. Recuperado de

13
Colisiones.PDF

Este mtodo se genera a partir de la elevacin de un valor al cuadrado, donde ese valor
inicia con el nmero 1 y lo suma a la direccin que se encuentra en colisin (d+i 2), si se
genera nuevamente una colisin el valor del nmero se incrementa, se eleva al cuadrado
y se suma a la direccin inicial (d+1, d+4, d+9, d+16, , d+i 2), este proceso se repite
hasta que se encuentre una direccin vaca. Est generacin de direcciones puede llegar
a exceder el tamao de la estructura, si es as, la direccin inicia en uno y el valor inicial a
elevar es el cero. (Takeyas, 2012)
Este mtodo es similar al de la prueba lineal. La diferencia consiste en que, en lugar de
buscar en las posiciones con direcciones: dir_Hash, dir_Hash + 1, dir_Hash + 2, dir_Hash
+ 3,.... {Buscamos linealmente en las posiciones con direcciones: dir_Hash, dir_Hash + 1,
dir_Hash + 4, dir_Hash + 9,..., dir_Hash+i 2 {Si el nmero m de posiciones en la tabla T es
un nmero primo y el factor de carga no excede del 50%, sabemos que siempre
insertaremos el nuevo elemento X y que ninguna celda ser consultada dos veces durante
un acceso.
Desventaja:

Pueden quedar casillas sin visitar, adems resulta difcil definir


general para detener el ciclo.

una condicin

Se puede utilizar una variable auxiliar, que dirija el recorrido de tal forma que
garanticen que sern visitadas todas las casillas. (Fidalgo., 2013)

Ejemplo adquirido de Fernndez Carlos A. en su obra Estructura de Datos


menciona que:
V = [25, 43, 56, 35, 54, 13, 80, 104, 55]
Usando la funcin hash:
H (K)= (k mod 10) + 1
Prueba Cuadrtica (V, N, K)

//Este algoritmo busca el dato con clave K en el arreglo V de N elementos.


//Resuelve el problema de las colisiones por medio de la prueba cuadrtica
//D, DX e I son variables de tipo entero

14

D = H [K] //Genera direccin


Si (V [D] == K) entonces
{
Escribir El elemento est en la posicin D

Si no
{
Hacer I = 1 y DX = D + I2;
{
Repetir mientras (V [DX] <> K) y (V [DX] <> VACO)
{
Hacer I = I + 1; DX = D + I2 ;
{
Si (DX > N) Entonces
}
Hacer I=0; DX=1 y D=1;
}
}
}
}
}
Si (V [DX] == K) entonces
{
Escribir El elemento esta en la posicin DX
}
Si no
{
15

Escribir El elemento no est en el arreglo


}
}

Cdigo. Prueba Cuadrtica.


public static int pruebaCuadratica (int X, int[] A)
{
int m = A.length;
int dirHash = X%m;
if (A[dirHash] == X) return dirHash;
else {
int i = 1;
int cont = 0;
int dirReh = (dirHash + 1)%m;
while ((A[dirReh] != X) && (A[dirReh] != 0) && (cont < m*10))
{
i++;
dirReh = (dirHash + (i*i))%m;
cont++;
}
if (A[dirReh] == X) return dirReh;
else return -1;
}
}

1.4.1.3 La doble direccin hash


Consiste en generar otra direccin hash, una vez que se detecta la colisin, la generacin
de la nueva direccin se hace a partir de la direccin previamente obtenida ms uno. La
funcin hash que se aplique para generar la nueva direccin puede no ser la misma a la
utilizada en el proceso anterior, para esto no existe una regla establecida, lo que permite
utilizar cualquiera de las funciones hash conocidas hasta ahora.
En este mtodo se debe generar otra direccin aplicando una funcin hash H2 a la
direccin previamente obtenida. (Fidalgo., 2013)
16

Entonces buscamos linealmente en las posiciones que se encuentran a una distancia H


2(X), 2 H 2(X), 3 H 2(X), ... { La funcin hash H 2 que se aplique a las sucesivas
direcciones puede ser o no ser la misma que originalmente se aplic a la clave. No existe
una regla que permita decidir cul ser la mejor funcin a emplear en el clculo de las
sucesivas direcciones. Pero una buena eleccin sera H 2(X) = R (X%R), siendo R un
nmero primo ms pequeo que el tamao del array. Y se obtienen unos resultados
mejores cuando el tamao del array es un nmero primo
Ejemplo:
V = [25, 43, 56, 35, 54, 13, 80, 104]
H (K)= (k mod 10) +1

DobleDireccion (V, N, K)

//Este algoritmo busca el dato con clave K en el arreglo V de N elementos.


//Resuelve el problema de las colisiones por medio de la doble direccin hash
//D y DX son variables de tipo entero
D=H [K] //Genera direccin
Si (V [D] == K) entonces
{
Escribir El elemento esta en la posicin D
Si no
{
Hacer DX = H (D);
17

{
Repetir mientras (DX <=N) y (V [DX]<> K) y (V[DX]<>VACO) y (DX<>D)
Hacer DX = H (DX) ;
}
Si (V [DX] == K) entonces
{
Escribir El elemento est en la posicin DX
Si no
{
Escribir El elemento no est en el arreglo
}
}
}

Cdigo. Doble direccin Hash.


Public static int dobleDireccionamiento(int X, int R, int[] A){
int m = A.length;
int dirHash = X%m;
if (A[dirHash] == X) return dirHash;
else {
int dirHash2 = R (X%R);
int i = 1;
int dirReh = (dirHash + dirHash2)%m;
while ((A[dirReh] != X) && (A[dirReh] != 0))
{
i++;
dirReh = (dirHash + i*dirHash2)%m;
}
If (A[dirReh] == X) return dirReh;
18

else return -1;


}
}

1.4.2 Arreglos Anidados


Arreglos anidados Este mtodo consiste en que cada elemento del arreglo tenga otro
arreglo en el cual se almacena los elementos colisionados. Si bien la solucin parece ser
sencilla, es claro tambin que resulta ineficiente. Al trabajar con arreglos depende del
espacio que se halla asignado a este lo cual conduce a un nuevo problema difcil de
solucionar: elegir un tamao adecuado de arreglo que permita el equilibrio entre el coste
de memoria y el nmero de valores colisionados que pudiera almacenar. (fernandez,
2010)

(Takeyas, 2012). Administracin de archivos [Arreglos Anidados]. Recuperado de

Colisiones.PDF

En cada elemento del arreglo tenga otro arreglo, donde se almacenan los elementos
colisionados
1. Solucin ineficiente
2. costo de memoria
3. Nmero de valores colisionados

Ejemplo:
V = [25, 43, 56, 35, 54, 13, 80, 104]
Usando la funcin hash:
H (K)= (k mod 10) +1

19

80 - - - - - - 43 54 25 56 - - - - - 13 104 35 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

1.4.3

80

43

13

54

104

25

35

56

Encadenamiento

35

Cada elemento del arreglo tiene un apuntador a una lista ligad, la cual se ira generando e
104
ira almacenando los valores colisionados. (takeyas, 2012)
Es un mtodo eficiente debido al dinamismo de las listas

Desventajas
Ocupa un espacio adicional al de la tabla
Requiere un manejo de lista ligada
Si la lista crecen demasiado se pierde el acceso directo del mtodo hash

13

Ejemplo:
V=[ 25, 43, 56, 35, 54, 13, 80, 104 ]
Almacenados usando la funcin hash:
H(K)= (k mod 10) +1

20

IMPLEMENTACIN DEL MTODO HASH EN JAVA


package main;

import java.util.Random;
import java.util.Scanner;

public class Hash1 {

public static void main(String[] args) {


Integer arreglo[] = new Integer[6];
double auxiliar;
Random numeros = new Random();
for (int i = 0; i < arreglo.length; i++) {
auxiliar = numeros.nextDouble();
21

auxiliar = auxiliar * 100;


arreglo[i] = (int) auxiliar;//cast toma la part entera
}
imprimir(arreglo);
Integer arregloindice[] = new Integer[6];
for (int i = 0; i < arregloindice.length; i++) {
int indice = arreglo[i] % 5;

if (arregloindice[indice] == null) {
arregloindice[indice] = arreglo[i];
} else {
System.out.println("Ocurre una colision en " + indice);
for (int j = 0; j < arregloindice.length; j++) {
if (arregloindice[j] == null) {
arregloindice[j] = arreglo[i];
System.out.println("se guardo en la posicion: " + j);
break;
}
}

}
System.out.println("Tabla hash");
imprimir(arregloindice);
int buscar;
Scanner leer = new Scanner(System.in);
System.out.println("ingrese el numero que desea buscar");
buscar = leer.nextInt();
buscar(arregloindice, buscar);
}

public static void imprimir(Integer[] arreglo) {


22

for (int i = 0; i < arreglo.length; i++) {


System.out.print(arreglo[i] + " ");
}
System.out.println();
}

public static void buscar(Integer[] arreglo, int dato) {


int contador=0;
for (int i = 0; i < arreglo.length; i++) {
if (dato == arreglo[i]) {
System.out.println("el numero se encuentra en el indice: " + i);
} else {
contador++;
}
}
if (contador==arreglo.length) {
System.out.println("numero no encontrado");
}
}
}
PRUEBA DE ESCRITORIO

23

IMPLEMENTACIN DEL MTODO HASH EN C++


#include<stdlib.h>
#include "stdio.h"
#include <cstdlib>
#include<conio.h>
#include<Math.h>
#include<fstream>
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
typedef struct no no_hash;
struct no
{
int data;
int state; /* 0 para VACIO, 1 para REMOVIDO e 2 para OCUPADO */
};
// Calcula la funcin de distribucin
int funcion(int k, int m, int i)
{
return ((k+i)%m);
}
// Crea la tabla hash
no_hash *Crea_Hash(int m)
{
no_hash *temp;
int i;
if((temp = (no_hash*)malloc(m*sizeof(no_hash))) != NULL)
{
for(i = 0; i < m; i++)
temp[i].state = 0;
return temp;
}
else
exit(0);
}
// Inserta un elemento k en la tabla T de tama m
void Inserta_Hash(no_hash *T, int m, int k)
{
int j, i = 0;
do
{
j = funcion(k, m, i);
if(T[j].state == 0 || T[j].state == 1)
{
T[j].data = k;
T[j].state = 2;
cout<<"\nElemento insertado con xito!";
return;
}

24

else
i++;
}while(i < m);
cout<<"\nTabla llena!";
}
int Busca_Hash(no_hash *T, int m, int k, int i)
{
int j;
if(i < m)
{
j = funcion(k, m, i);
if(T[j].state == 0)
return -1;
else
if(T[j].state == 1)
return Busca_Hash(T, m, k, i+1);
else
if(T[j].data == k)
return j;
else
return Busca_Hash(T, m, k, i+1);
}
return -1;
}
int Remove_Hash(no_hash *T, int m, int k)
{
int i;
i = Busca_Hash(T, m, k, 0);
if(i == -1)
return -1;
else
{
T[i].state = 1;
return 1;
}
}
void main()
{
int m, i, k;
char resp;
no_hash *T;
cout<<"\nEntre con el tamao de la tabla: ";
cin>>m;
T = Crea_Hash(m);
while(1)
{
cout<<"\nInsertar (i) Buscar (b) Remover (r) Salir (s)\n";
resp = getche();
getch();
switch(resp)
{
case 'i':
cout<<"\nIngrese el nmero a ser insertado en la tabla: ";
cin>>k;
Inserta_Hash(T, m, k);
break;
case 'b':
cout<<"\nIngrese el nmero a ser buscado en la tabla: ";
cin>>k;
i = Busca_Hash(T, m, k, 0);
if(i == -1)
cout<<"\nNumero no encontrado!";
else
cout<<"\nNumero encontrado!";
break;
case 'r':
cout<<"\nIngrese el nmero a ser eliminado de la tabla: ";
cin>>k;

25

}
}

i = Remove_Hash(T, m, k);
if(i == -1)
cout<<"\nNumero no encontrado!";
else
cout<<"\nNumero eliminado con xito!";
break;
case 's':
exit(0);
break;
getch();

}
PRUEBA DE ESCRITORIO

HERRAMIENTAS PARA REALIZAR EL VIDEO


Se utilizara CamStudio que es un software open source o de cdigo
abierto que nos permite grabar nuestra pantalla en formato .AVI.
Funciona nicamente con Windows.
Se la escogi porque no llega a abrumar al usuario, tiene una gran
cantidad de opciones y funcionalidades. Contiene caractersticas
propias de la edicin de video, como cortar y pegar planos o aadir
distintas clases de transiciones, adems es totalmente gratuito.

CONCLUSIONES

26

Una tabla hash es una estructura de datos que soporta la recuperacin, eliminacin
e insercin de elementos de forma muy rpida.
Las tablas hash permiten que el coste medio de las operaciones insertar, buscar y
eliminar sea constante, siempre que el factor de carga no sea excesivo para reducir
la probabilidad de colisin.
Una funcin hash debe ser fcilmente calculable, sin costosas operaciones, tambin
debe tener una buena distribucin de valores entre todas los componentes de la
tabla.
Una buena funcin hash distribuye equitativamente la asignacin de claves a travs
de las posiciones de la tabla hash.
Si la funcin est mal diseada producir muchas colisiones.
La fortaleza de una funcin hash requiere que estas colisiones sean las mnimas
posibles y que encontrarlas sea lo ms difcil posible.

RECOMENDACIONES

Tome en cuenta los requisitos para elaborar una buena tabla hash.
Escoja el tipo de tabla adecuado para nuestro algoritmo.
Trate de que el nmero de colisiones sea casi nulo.
En caso de que existan colisiones opte por el mtodo de tratamiento ms adecuado
para su algoritmo.
Tomar en cuenta los mtodos que se han explicado en este documento para
resolver las colisiones.
Tener en cuenta que tipo de lenguaje de programacin se est utilizando para el
algoritmo.
Note que este mtodo de bsqueda es ms sencillo de programar en java.
Recuerde que tambin existe un material de ayuda en el cual se explica de forma
ms sencilla como funciona el mtodo de bsqueda por transformacin de claves,
adems contiene un ejercicio explicado paso a paso de cmo se programa.

BIBLIOGRAFIA
27

Castro, A. (23 de octubre de 2014). slideshare. Obtenido de Funcin Hash: metodos de


divisin y de medio Cuadrado.: http://es.slideshare.net/analivecastrovargas/funcionhash-metodos-de-divisi
fernandez, c. a. (12 de 2010). estructura de datos para arreglos. Recuperado el 02 de 02
de 2015, de estructura de datos para arreglos: http://www.utm.mx/~caff/doc/Notas
%20de%20Estructura%20de%20datos.pdf
Fidalgo., R. L. (2013). Algoritmos de Busqueda y Ordenacion.
Guzmn, L. (17 de abril de 2014). Slideshare. Obtenido de Algoritmos de busqueda - hash
truncamiento: http://es.slideshare.net/lutzhooo/algoritmos-de-busqueda-33624661
Olmos, I. (2 de diciembre de 2014). Tablas Hash y rboles. Obtenido de
www.cs.buap.mx/~iolmos/ada/TablasHashArbolesBinarios.pdf
Sedgewick , R., & Wayne, K. (5 de mayo de 2014). Algorithms, 4th Edition. Obtenido de
http://algs4.cs.princeton.edu/34hash/
takeyas, i. b. (16 de 03 de 2012). administracion de archivos. Recuperado el 02 de 02 de
2015, de administracion de archivos:
http://www.teclaredo.edu.mx/takeyas/Apuntes/Administracion_Archivos/Apuntes/Coli
siones.PDF
Takeyas, I. B. (2012). Administracion de Archivos. Obtenido de
http://www.teclaredo.edu.mx/takeyas/Apuntes/Administracion_Archivos/Apuntes/Coli
siones.PDF
Vilugron, J. (16 de abril de 2014). slidechare. Obtenido de Algoritmos de Bsqueda:
http://es.slideshare.net/javiervilugron/algoritmo-de-busqueda-truncamiento

28

Você também pode gostar