Вы находитесь на странице: 1из 4

ESTRUCTURA DE DATOS 1

Tablas Hash o de dispersión


Roosselvet Pacci, Richard Butrón
Escuela Profesional de Ingenierı́a en Informática y Sistemas
Universidad Nacional Jorge Basadre Grohmann
pdassem@gmail.com, rbrutron@gmail.com

Abstract— In this article we describe and Analise how does que dos claves distintas cualesquiera caigan en celdas difer-
Hash Table work. A hash table uses a hash function to compute entes. Esto es imposible, ası́ que se busca una función de
an index into an array of buckets or slots, from which the desired dispersión que distribuya homogéneamente las llaves entre las
value can be found. We implement a program where we create
a has function with numeric key. It concludes that the medium celdas. Resta elegir una función, decidir qué hacer cuando
cost for insert, find, and delete operations is constant. dos claves caen en el mismo valor (lo que se llama colisión)
y decidir el tamaño de la tabla. Un uso común de las tablas
Medium cost, c++, hash function. hash lo representan los diccionarios. Un diccionario almacena
objetos formados por una clave, por la cual se busca en el
I. I NTRODUCI ÓN diccionario, y su definición, que es lo que se devuelve.
Muchas aplicaciones requieren un conjunto dinámico que
soporte las operaciones de un diccionario: Insertar, Buscar,
Borrar. Es posible hacer uso de una lista enlazada con un A. Conceptos básicos
tiempo Θ(n) ; sin embargo, este tiempo se puede reducir
notablemente a orden Θ(1) en la mayora de los casos usando 1) Colisión: Si la función de transformación devuelve un
una tabla hash. Esta idea surge de los arreglos, que se pueden mismo valor para dos claves se produce una colisión. Se puede
acceder a sus elementos en un tiempo Θ(1), pero, sólo resolver este problema mediante las alternativas:
permiten claves iguales a sus ı́ndices y además se tendrı́a que • Encadenamiento enlazado: En cada posición de la tabla
usar un arreglo igual de grande al conjunto de claves posibles. se asigna una lista enlazada en la que se inserta los
Otra opción es usar un arreglo menor a la cual podemos elementos cuyo valor hash se le asigne la misma posición.
mapear las claves en uso, esta función de mapeo es la tabla • Exploración
hash. – Exploración lineal: Visita la siguiente casilla para ver
Como es posible que dos claves conduzcan al mismo mapeo si esta libre e insertar el elemento. Si no, sigue el
(lo cual se conoce como una colisión), es necesario buscar mismo paso.
formas para resolver esta situación. Una forma, conocida como – Exploración cuadrática: Visita la casilla i2 en la que
hashing abierto (hay otros términos dependiendo del texto), se aleja de colisión, y si esta libre, se inserta, y si
crear una lista asociada a cada entrada del arreglo. Otra forma, no, hace el mismo procedimiento.
conocida como hashing cerrado, almacena las claves en las
2) Hashing: El hashing utiliza una función para generar un
mismas entradas del arreglo o tabla hash.
código hash pseudo-aleatorio a partir de la clave del objeto y
La idea básica es transformar las claves en direcciones de
luego utiliza este código (direccin directa) para indexar en la
memoria mediante una función de transformación.
tabla hash.
3) Hashing enlazada: El Hashing enlazado usa un vector
de Listas Enlazadas. Aquellos objetos que reciban un de-
II. D EFINICI ÓN DE DISPERSI ÓN
terminado valor de Hash, se insertarán en la lista enlazada
La dispersión es una técnica empleada para realizar inser- correspondiente. El encadenamiento es un enfoque sencillo y
ciones, eliminaciones y búsquedas en un tiempo promedio con- eficaz para gestionar las colisiones.
stante. La estructura de datos ideal para la tabla de dispersión 4) Factor de carga: Es igual a la cantidad de elementos a
es simplemente un vector de tamao fijo N que contiene las insertar en la tabla dividida en la capacidad de esta misma.
claves. Cada clave se hace corresponder con algún número en
el intervalo entre 0 y N 1, y se coloca en la celda correcta. F actordecarga(λ) = Elementos/Capacidad. (1)
A la correspondencia se le denomina función de dispersión
que, idealmente, debe ser simple de calcular y debe asegurar Más diminuta es el factor de carga, todas las operaciones en
Roosselvet. Pacci es estudiante del quinto ciclo de la Escuela Profesional de
la estructura serán de costo Θ(1).
Ingeniera en Informtica y Sistemas de la Universidad Nacional Jorge Basadre 5) Suposicin de hashing uniforme: Es cuando cualquier
Grohmann. elemento es igualmente probable de caer en cualquiera de las
Richard Butrón es estudiante del quinto ciclo de la Escuela Profesional de
Ingeniera en Informtica y Sistemas de la Universidad Nacional Jorge Basadre m entradas de la tabla hash, independientemente de cualquier
Grohmann. otro elemento.
ESTRUCTURA DE DATOS 2

III. H ASHING ABIERTO • Se busca en sucesión en las celdas d0(x), d1(x), d2(x)...
La estrategia consiste en tener una lista de todos los ele- donde di(x) = (dispersion(x)+f (i))modN, conf (0) =
mentos que se dispersan en el mismo valor como se observa 0.
en la Fig.1. • La función f es la estrategia de resolución de las coli-
siones.
Como todos los datos se meten en la tabla, ésta tiene que ser
más grande para la dispersión cerrada que para la abierta.
En general, para la dispersión cerrada el factor de carga debe
estar por debajo de λ = 0, 5. La eliminación estándar no se
puede realizar en una tabla de dispersión cerrada, porque la
celda pudo haber causado una colisión en el pasado. Las tablas
de dispersión cerrada requieren eliminación perezosa, aunque
en este caso no haya realmente ”pereza” implicada.

V. F UNCIONES H ASH
Una buena función hash deberı́a satisfacer la suposición
de hash uniforme.Como el recorrido de la función de hash es
un número natural, hay que saber interpretar o transformar a
Fig. 1. Hashing abierto número natural tipo de clave.

Para efectuar buscar, usamos la función de dispersión para • Si se trata de claves enteras, el problema está más o
determinar qué lista recorrer. Para efectuar un insertar, recor- menos resuelto.
remos la lista adecuada para revisar si el elemento ya está en • Si se trata de secuencia de caracteres, strings, se puede
la lista. Si el elemento resulta ser nuevo, se inserta al frente o interpretar cada caracter como un número en base 128
al final de la lista. Además de las listas enlazadas, se podrı́a (los números ASCII van del 0 al 127) y el string completo
usar cualquier esquema para resolver colisiones, como un árbol como un número en base 128. Ası́ por ejemplo la clave
binario de búsqueda. El factor de carga, λ, de una tabla de pt puede ser transformada a (112 ∗ 128 + 116) = 14452.
dispersión es la relación entre el número de elementos en la OBS: ASCII(p) = 112yASCII(t) = 116.
tabla y su tamao. La longitud media de una lista es λ. Y la • En adelante supondremos que las claves son números nat-
regla general de una dispersión abierta es hacer el tamao de la urales (o ya han sido transformadas a números naturales)
tabla casi tan grande como el número de elementos esperados
(λ = 1). El esfuerzo necesario para realizar una búsqueda A. Método de la división
es el tiempo constante necesario para evaluar la función de
Este método consiste en tomar el resto de la división por
dispersión Θ(1) más el tiempo necesario para recorrer la lista.
m, el número de entradas de la tabla.
• En una búsqueda infructuosa el promedio de nodos por
Ası́ h(k) = kmodm En C serı́a h(k) = k/m;
recorrer es Θ(λ).
• En una búsqueda con éxito, Θ(λ/2).
• Usar m = una potencia de 2 no es buena idea ya que el
valor de hash queda dependiendo de sólo los bits menos
IV. H ASHING C ERRADO
significativos de k.
La dispersión abierta tiene la desventaja de que requiere • Una forma de hacer hash(k) dependiente de todos los
apuntadores. En la Fig.2 se observa el sistema de dispersión bits menos significativos es usar número primos no muy
cerrada, si ocurre una colisión, se intenta buscar celdas alter- cercanos a una potencia de dos.
nativas hasta encontrar una vacı́a.
B. Método de la multiplicación
Este método opera en dos pasos.
• Primero, multiplicamos la clave por una constante A en
el rango 0 < A < 1 y extraemos la parte fraccionaria de
k ∗ A.
• Segundo, Multiplicamos este valor por el número de
entradas de la tabla y tomamos el peso del (o truncamos
el) resultado.
Una ventaja de este método es que el valor de m no
es crı́tico. El método trabaja bien con cualquier valor de
A, pero trabaja mejor con algunos valores que otros, por
ejemplo A (sqrt(5) − 1)/2 es recomendado. Ası́ para m =
Fig. 2. Hashing cerrado 10000, h(123456) = 10000 ∗ (123456 ∗ 0.61803..mod1) = 41
ESTRUCTURA DE DATOS 3

VI. P ROCEDIMIENTO PARA CREAR UNA FUNCI ÓN HASH VII. A PLICACI ÓN
1) Definimos una ”tabla”(array) como en la Tabla I. con 1) Creamos un menú de operaciones Fig. 3 para poder
los espacios correspondientes (simulando una tabla de operar sobre la tabla hash.
100 casillas).

TABLE I
D EFINICI ÓN DE UN ARRAY
Nombre Código –
1 ... ... ...
2 ... ... ...
... ... ... ...

2) Insertamos los datos, y elegimos uno de éstos para


efectuar la operación matemática(Hashing) como en la
Fig. 3. Menú de operaciones insertar, buscar y eliminar.
Tabla.II
TABLE II 2) Se ingresan datos por el teclado como en la Fig 4 y la
I NSERCI ÓN DE DATOS EN EL ARRAY clave hash es generada automáticamente de acuerdo al
Nombre Código – carnet del estudiante ingresado.
1 Luis 2014-119078 ...
2 ... ... ...

3) Usamos los valores enteros de los caracteres escogidos


como en la Tabla III.
TABLE III
VALORES PARA CADA D ÍGITO
Caracter 2 0 1 4 - 9 7 8
Valor 50 48 49 52 45 57 55 56

4) Realizamos la operación matemática para conseguir el


ı́ndice de ubicación (Hashing). Fig. 4. Inserción de datos y generación de la clave hash.

• Inicializamos un d en cero. Y procedemos


3) Se coloca el código del Carnet del estudiante como en
d = 27 ∗ (0) + 56 = 56 (2) la Fig. 5, ya que es necesario para la funcin hash.

• Repetimos la operación, según la cantidad de car-


acteres (Usando el resultado anterior).

d = 27(56) + 55 = 1512 + 55 = 1567 (3)

5) Determinamos los dı́gitos que usaremos del resultado.


Fig. 5. Búsqueda del dato por la clave Código
d = 1545585816 (4)
4) A continuación se muestra los datos del estudiante, ver
• Cogemos los 2 últimos dı́gitos y los usamos como Fig. 6.
el nuevo ı́ndice.
´
Indice = 16(clavehash) (5)

6) Introducimos los datos en el ı́ndice respectivo, ver Tabla


IV.
TABLE IV
I NSERCI ÓN DESPU ÉS DE LA TRANSFORMACI ÓN
Nombre Código –
... ... ... ...
16 Luis 2014-119078 ...
... ... ... ... Fig. 6. Datos mostrados con el código de estudiante
ESTRUCTURA DE DATOS 4

5) Para eliminar se ingresa el código del Carnet del es-


tudiante como en la Fig. 7 para poder usar la función
de eliminación de registro, aparece 0 con el mensaje de
eliminación indicando que el registro ha sido eliminado
con éxito, si hubiera aparecido 1 la eliminación no se
hubiera dado.

Fig. 7. Eliminación de una clave.

6) Se utiliza la funcin de búsqueda para comprobar que el


registro se eliminó ver Fig. 8.

Fig. 8. Búsqueda de una clave eliminada

VIII. C ONCLUSIONES
Las tablas hash permite que el coste medio de las opera-
ciones insertar, buscar y eliminar sea constante. Siempre y
cuando el factor de carga λ no sea excesivo para reducir la
probabilidad de colisión.
Hay que elegir correctamente la función hash. Siendo
fácilmente calculable y con buena distribución de valores entre
todos los componentes de la tabla.

R EFERENCES
[1] A. Gonzáles (2002),Tablas HASH, ELO320:Estructura
de Datos y Algoritmos. Disponible en:
http://www.madsgroup.org/docencia/alg/tablasHash.pdf
[2] F. J. Ceballos, C/C++ Curso de programacion, 3ra ed. Madrid, España:
Albadalejo, S.L., 2007
[3] O. Cairo y S. Guardati, Estructura de datos, 3ra ed. Mac-
GrawHill/Interamericana de México, 2006
[4] A. V. Aho, J. D. Ullman y J. E. Hopcroft, Estructura de datos y algo-
ritmos, 3rd ed. México, DF, Addison-Wesley:Iberoamericana: Sistemas
Técnicos de Edición, 1988
[5] L. Joyanes y I. Zahonero, Estructura de datos en JAVA, 3rd ed. Madrid,
España: MacGrawHill/Interamericana de España, 2008

Вам также может понравиться