Escolar Documentos
Profissional Documentos
Cultura Documentos
PARALELO: 10
Contenido
INTRODUCCIN.............................................................................................. 3
OBJETIVOS...................................................................................................... 4
Objetivo general:..................................................................................... 4
Objetivos especficos:............................................................................. 4
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
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.
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.
registros
de
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.
Para el diseo de una tabla hash, es de gran importancia cumplir con lo siguiente:
10
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:
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
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
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:
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:
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)
14
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
DobleDireccion (V, N, K)
{
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
}
}
}
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
import java.util.Random;
import java.util.Scanner;
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);
}
23
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
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
28