Documente Academic
Documente Profesional
Documente Cultură
15211886
15211899
15211325
15211906
15211918
EQUIPO: CHICHARITOS
ndice
Concepto y Caractersticas
3-5
Ejemplo
6-7
Algoritmo (Pseudocdigo)
7-8
Cdigo
Uso de memoria
Arreglos pequeos
9-13
14
14-15
Arreglos grandes
16-17
Lmite
18-19
Bibliografa
19
Conceptos y Caractersticas
Bsqueda Hash
El mtodo consiste en asignar el ndice a cada elemento con una transformacin del
elemento, esto se hace mediante una funcin de conversin llamada funcin hash.
Hay diferentes funciones para transformar el elemento y el nmero obtenido toma el
valor del ndice del elemento.
La principal forma de transformar el elemento es asignarlo directamente, es decir al
0 le corresponde el ndice 0, al 1 el 1, y as sucesivamente pero cuando los
elementos son muy grandes se desperdicia mucho espacio ya que necesitamos
arreglos grandes para almacenarlos y estos quedan con muchos espacios libres,
para utilizar mejor el espacio se utilizan funciones ms complejas.
La funcin de hash ideal debera ser biyectiva, esto es, que a cada elemento le
corresponde un ndice, y que a cada ndice le corresponda un elemento, pero no
siempre es fcil encontrar esa funcin, e incluso a veces es intil, ya que puedes no
saber el nmero de elementos a almacenar.
Hay diversos mtodos de Hashing, entre los cuales destacan:
1.- Restas sucesivas. Esta funcin se emplea con claves numricas entre las que
existan huecos de tamao conocido, obtenindose direcciones consecutivas. Un
ejemplo seran los nmeros de control de una universidad, son consecutivos y est
definido el nmero de alumnos.
15210000 -15210000 -> 0
15210001 -15210000 -> 1
15210002 -15210000 -> 2
Rpido y eficiente.
Arreglo ya ordenado.
Desaprovechamiento de la memoria.
Ejemplo
1.- Restas sucesivas.
Valor Original
Valor Constante
Valor resultante
15210000
15210000
15210001
15210000
15210002
15210000
...
...
...
15210400
15210000
400
1679
4567
8471
0435
5033
Elevado al cuadrado
Valor resultante
709
502681
26
456
207936
79
105
11025
10
879
772641
26
619
383161
31
4.- Truncamiento.
Valor original
5700931
703
3498610
481
0056241
064
9134720
142
5174829
142
5.- Plegamiento.
Valor original
Primera
particin
Segunda
particin
Tercera
particin
Valor
resultante
5700931
57
00
931
988
3498610
34
98
610
742
0056241
00
56
241
297
9134720
91
34
720
845
5174929
51
74
929
1054
Algoritmo (Pseudocdigo)
1: Inicio
2: Vector1, Vector2 arreglos enteros
3: Introducir el tamao del arreglo Vector1 y se guarda en variable entero
tamao
4: Vector1 = nuevo entero[tamao]
5: Vector2 = nuevo entero[tamao]
Llenar Vector1 con nmeros aleatorios
6: para entero i = 0; i < tamao del arreglo Vector1; i incremento
Vector1[i] = nmero aleatorio del 1 al 1000000
7: Escribir Arreglo generado
Desplegar el contenido del arreglo Vector1
8: para entero i = 1; i <= tamao del arreglo Vector1; i incremento
escribir i + .- + Vector[i 1]
Cdigo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//Libreras extras para calcular el tiempo de ejecucin
using System.Diagnostics;
using System.Threading;
namespace Hash
{
class Hash
{
//Creacin del objeto de nmeros aleatorios
Random random = new Random();
//Creacin de los arreglos. "Vector1" es el arreglo sin asignar direcciones.
"Vector2" es el arreglo con direcciones asignadas
public int[] Vector1;
public int[] Vector2;
//Mtodo para llenar el Vector1 con numeros aleatorios (1 - 1000000)
public void GenerarArreglo(int _tamao)
{
//Asigna el tamao del arrglo capturado por el usuario
Vector1 = new int[_tamao];
Vector2 = new int[_tamao];
for (int i = 0; i < Vector1.Length; i++)
{
Vector1[i] = random.Next(1, 1000000);
}
Console.Write("\nArreglo generado.\nPresione <ENTER> para regresar
al men... ");
}
//Mtodo para desplegar el contenido del arreglo "Vector1" (generalmente
sin ordenar)
public void Desplegar()
{
for (int i = 1; i <= Vector1.Length; i++)
{
Console.WriteLine(i + ".- " + Vector1[i - 1]);
}
Console.Write("\nPresione <ENTER> para regresar al men...");
}
//Mtodo para aadir direciones al arreglo
public void Direccion()
{
//Creacin del objeto para contar el tiempo de ejecucin
Stopwatch stopWatch = new Stopwatch();
//Inicializa la cuenta de tiempo
stopWatch.Start();
int residuo1, residuo2, I;
for (I = 0; I <= Vector1.Length - 1; I++)
{
residuo1 = (Vector1[I] % Vector1.Length - 1) + 1;
while (Vector2[residuo1] != 0)
{
residuo2 = residuo1 + 1;
if (residuo2 > Vector1.Length - 1)
residuo1 = 0;
else
residuo1 = residuo2;
}
Vector2[residuo1] = Vector1[I];
}
//Termina la cuenta de tiempo
stopWatch.Stop();
Console.WriteLine("\nDirecciones Asignadas");
//Objeto que obtiene el valor de la cuenta de tipo TimeSpan
TimeSpan ts = stopWatch.Elapsed;
//Asigna los valores en formato: hora, minutos,segundos y
milisegundos a una variable string
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
Console.WriteLine("Tiempo de bsqueda: " + elapsedTime);
}
//Mtodo de bsqueda hash
public void hash()
{
int residuo1, residuo2;
10
11
Console.WriteLine("\tMENU");
Console.WriteLine("1.- Generar Arreglo Aleatorio.");
Console.WriteLine("2.- Desplegar Vector 1");
Console.WriteLine("3.- Asignar Direcciones.");
Console.WriteLine("4.- Desplegar Vector 2 y Buscar Elemento.");
Console.WriteLine("5.- Salir del programa.");
Console.Write("\nIngrese una opcin: ");
opcion = Int16.Parse(Console.ReadLine());
switch (opcion)
{
case 1:
Console.Write("\nIndica el tamao del arreglo: ");
tamao = Int32.Parse(Console.ReadLine());
Console.Clear();
H.GenerarArreglo(tamao);
Console.ReadKey();
break;
case 2:
Console.Clear();
H.Desplegar();
Console.ReadKey();
break;
case 3:
Console.Clear();
H.Direccion();
Console.ReadKey();
break;
case 4:
int opc = 0;
do
{
Console.Clear();
H.hash();
Console.WriteLine("\n1-. Buscar otro dato");
Console.WriteLine("2-. Regresar al men");
Console.Write("\nIntroduce una opcin: ");
opc = Int32.Parse(Console.ReadLine());
switch (opc)
{
case 1:
break;
case 2:
12
break;
default:
Console.WriteLine("Valor no vlido");
Console.ReadKey();
break;
}
} while (opc != 2);
break;
case 5:
Console.Write("\nPresione ENTER para salir...");
Console.ReadKey();
break;
default:
Console.Write("Opcin incorrecta");
Console.ReadKey();
break;
}
} while (opcion != 5);
}
}
13
Uso de memoria
Arreglos Pequeos
La memoria utilizada en un arreglo pequeo (10,000 Elementos) es de 5,016 kb al
trmino de la ejecucin de todas las opciones.
14
15
Arreglos Grandes
La memoria utilizada en un arreglo grande(1000,000 Elementos) es de 12,652 kb al
trmino de la ejecucin de todas las opciones.
16
17
Lmite
18
Bibliografa:
[1]http://www.programacionfacil.com/estructura_datos_csharp/busqu
eda_hash.html
[2]http://descarga-tareas.blogspot.mx/2010/11/estructura-de-datos-c-b
usqueda-hash.html
[3]https://prezi.com/0avokopqs-4r/funcion-hash/
[4]http://www.genbetadev.com/seguridad-informatica/que-son-y-para
-que-sirven-los-hash-funciones-de-resumen-y-firmas-digitales
[5]https://msdn.microsoft.com/es-mx/library/0xdxysd8(v=vs.90).aspx
19