You are on page 1of 6

Método de búsqueda HASH Búsqueda mediante transformación de claves (Hashing

)
Es un método de búsqueda que aumenta la velocidad de búsqueda, pero que no requiere que los elementos estén ordenados. Consiste en asignar a cada elemento un índice mediante una transformación del elemento. Esta correspondencia se realiza mediante una función de conversión, llamada función hash. La correspondencia más sencilla es la identidad, esto es, al número 0 se le asigna el índice 0, al elemento 1 el índice 1, y así sucesivamente. Pero si los números a almacenar son demasiado grandes esta función es inservible. Por ejemplo, se quiere guardar en un array la información de los 1000 usuarios de una empresa, y se elige el número de DNI como elemento identificativo. Es inviable hacer un array de 100.000.000 elementos, sobre todo porque se desaprovecha demasiado espacio. Por eso, se realiza una transformación al número de DNI para que nos dé un número menor, por ejemplo coger las 3 últimas cifras para guardar a los empleados en un array de 1000 elementos. Para buscar a uno de ellos, bastaría con realizar la transformación a su DNI y ver si está o no en el array.

La función de hash ideal debería ser biyectiva, esto es, que a cada elemento le corresponda un índice, y que a cada índice le corresponda un elemento, pero no siempre es fácil encontrar esa función, e incluso a veces es inútil, ya que puedes no saber el número de elementos a almacenar. La función de hash depende de cada problema y de cada finalidad, y se pueden utilizar con números o cadenas, pero las más utilizadas son:

1

Restas sucesivas: esta función se emplea con claves numéricas entre las que existen huecos de tamaño conocido, obteniéndose direcciones consecutivas. Por ejemplo, si el número de expediente de un alumno universitario está formado por el año de entrada en la universidad, seguido de un número identificativo de tres cifras, y suponiendo que entran un máximo de 400 alumnos al año, se le asignarían las claves: 1998-000 --> 0 = 1998000-1998000 1998-001 --> 1 = 1998001-1998000 1998-002 --> 2 = 1998002-1998000 ... 1998-399 --> 399 = 1998399-1998000 1999-000 --> 400 = 1999000-1998000+400 ... yyyy-nnn --> N = yyyynnn-1998000+ (400*(yyyy-1998))

Los números se guardarán en las direcciones de memoria de 0 a N-1. al menos un índice es señalado por dos elementos (teorema del palomar). Por ejemplo. se pueden coger la primer. Si el número N es el 13. los números siguientes quedan transformados en: 13000000 --> 0 12345678 --> 7 13602499 --> 1 71140205 --> 6 73062138 --> 6 Mitad del cuadrado: consiste en elevar al cuadrado la clave y coger las cifras centrales.Método de búsqueda HASH Aritmética modular: el índice de un número es resto de la división de ese número entre un número N prefijado. A este fenómeno se le llama colisión. y es tratado más adelante. la tercer y la última cifras para formar un nuevo número: 13000000 --> 100 12345678 --> 138 13602499 --> 169 71140205 --> 715 73162135 --> 715 2 . Este método tiene el problema de que cuando hay N+1 elementos. si un número de 8 cifras se debe ordenar en un array de 1000 elementos. preferentemente primo. También se produce colisión. Este método también presenta problemas de colisión: 123*123=15129 --> 51 136*136=18496 --> 84 730*730=532900 --> 29 301*301=90601 --> 06 625*625=390625 --> 06 Truncamiento: consiste en ignorar parte del número y utilizar los elementos restantes como índice.

pero la diferencia está en la forma en que se manejan internamente estos datos: la "tabla hash" usa una "función de dispersión" para colocar los elementos.*.Método de búsqueda HASH Plegamiento: consiste en dividir el número en diferentes partes. Funciona transformando la clave con una función hash en un hash. for (int i = 0. public class hash { public static void main (String args[]) throws Exception { Hashtable hash = new Hashtable(10.10). dará otro número de tres cifras (y si no. i++) . por ejemplo). se cogen las tres últimas cifras): 13000000 --> 130=130+000+00 12345678 --> 657=123+456+78 71140205 --> 118 --> 1118=711+402+05 13602499 --> 259=136+024+99 25000009 --> 259=250+000+09 "LAS TABLAS HASH" Una tabla hash o mapa hash es una estructura de datos que asocia llaves o claves con valores. 3 y 2 cifras y se suman. por ejemplo) almacenados a partir de una clave generada (usando el nombre o número de cuenta.util. También se produce colisión. los elementos están formados por una pareja: una clave y un valor. más que si hacemos una búsqueda secuencial (como en un array) o binaria (como en un ArrayList ordenado). i <= 100. un número que la tabla hash utiliza para localizar el valor deseado. pero a cambio el acceso a partir de la clave es muy rápido. La operación principal que soporta de manera eficiente es la búsqueda: permite el acceso a los elementos (teléfono y dirección. 3 En una "tabla hash". si dividimos los número de 8 cifras en 3. y operar con ellas (normalmente con suma o multiplicación). como en un SortedList. de forma que no se pueden recorrer secuencialmente. ///////////////CÓDIGO EN JAVA///////////////// import java. Por ejemplo.

hasMoreElements(). Varían en los conjuntos de partida y de llegada y en cómo afectan a la salida similitudes o patrones de la entrada.get(e. ya que el rango de posibles claves es mucho menor que el de posibles objetos a resumir (las claves suelen tener en torno al centenar de bits. Es posible que existan claves resultantes iguales para objetos diferentes.out. como los arrays asociativos. e.println (hash. entre otros. . hash. } } } ///////FIN DEL CÓDIGO///////// QUÉ ES UNA FUNCIÓN DE HASH 4 Es una función para resumir o identificar probabilísticamente un gran conjunto de información.) { System. es decir que se podrán identificar unívocamente las entradas (ver función inyectiva). Una propiedad fundamental del hashing es que si dos resultados de una misma función son diferentes. Una buena función de hash es una que experimenta pocas colisiones en el conjunto esperado de entrada. Son usadas en múltiples aplicaciones. criptografía. pero los ficheros no tienen un tamaño límite). entonces las dos entradas que generaron dichos resultados también lo son.nextElement())).put( entero. procesamiento de datos y firmas digitales. "Numero : " + i).Método de búsqueda HASH { Integer entero = new Integer ( i ).keys(). dando como resultado un conjunto imagen finito generalmente menor (un subconjunto de los números naturales por ejemplo). } for (Enumeration e = hash.

5 INSERCIÓN Para almacenar un elemento en la tabla hash se ha de convertir su clave a un número. Este problema se puede solucionar asociando una lista a cada posición de la tabla. Si en la posición de la tabla ya había otro elemento. --->Desaprovechamiento de la memoria. aplicando otra función o buscando el siguiente elemento libre. Estas posibilidades han de considerarse a la hora de recuperar los datos. El elemento se almacena en la posición de la tabla obtenido en el paso anterior. lo cual se consigue con la función módulo. Si la función está mal diseñada. Una función resumen que distribuya uniformemente las claves. Se trata de una operación costosa. se producirán muchas colisiones. se ha producido una colisión. Si se reserva espacio para todos los posibles elementos. se consume más memoria de la necesaria. Esto se consigue aplicando la función resumen a la clave del elemento. Tras este paso se obtiene un índice válido para la tabla. Desventajas: --->Necesidad de ampliar el espacio de la tabla si el volumen de datos almacenados crece. El resultado de la función resumen ha de mapearse al espacio de direcciones del array que se emplea como soporte. se suele resolver reservando espacio únicamente para punteros a los elementos. 2.Método de búsqueda HASH VENTAJAS E INCONVENIENTES DE LAS TABLAS HASH Ventajas: Una tabla hash tiene como principal ventaja que el acceso a los datos suele ser muy rápido si se cumplen las siguientes condiciones: 1. --->Dificultad para recorrer todos los elementos. . Se suelen emplear listas para procesar la totalidad de los elementos. Una razón de ocupación no muy elevada (a partir del 75% de ocupación se producen demasiadas colisiones y la tabla se vuelve ineficiente).

las tablas hash son más útiles cuando se almacenan grandes cantidades de información. 6 . así que el acceso ordenado a su contenido es bastante lento.Método de búsqueda HASH Las tablas hash se suelen implementar sobre arrays de una dimensión. aunque se pueden hacer implementaciones multi-dimensionales basadas en varias claves. es decir. Como en el caso de los arrays.[1] sin importar el número de elementos en la tabla. en función del número de elementos. Comparada con otras estructuras de arrays asociadas. Otras estructuras como árboles binarios auto-balanceables son más rápidos en promedio (tiempo de búsqueda O(log n)) pero la información está ordenada en todo momento. Las tablas hash almacenan la información en posiciones pseudo-aleatorias. las tablas hash proveen tiempo constante de búsqueda promedio O(1). en casos particularmente malos el tiempo de búsqueda puede llegar a O(n). Sin embargo.