Está en la página 1de 19

Unidad 4

1 //Escenario
Escenario27
Lectura fundamental
Fundamental

Tablas hash
Etapas de un plan de comunicación
estratégica

Contenido

1 Definición

2 Conceptos básicos

3 Recomendaciones de diseño de tablas hash

4 Técnicas de diseño de funciones hash

5 Operaciones básicas

Palabras clave: tabla hash, función hash, factor de carga, capacidad, eficiencia.
1. Definición
Previamente se ha indicado que las listas son estructuras de datos que ofrecen operaciones de
búsqueda, inserción y modificación de valores con complejidad temporal O(n), donde n es la cantidad
de datos; pero, ¿qué pasaría si se utilizaran varias listas para albergar la misma información?

Tómese en consideración el siguiente conjunto C que contiene treinta elementos: < 11, 95, 36, 96,
42, 38, 39, 32, 49, 24, 43, 21, 75, 53, 58, 55, 25, 99, 12, 68, 80, 83, 44, 34, 98, 41, 50, 69, 66,
46>.

Sea t=10 y f(x)=|x|%t la función que recibe un valor entero x y devuelve como resultado el valor
absoluto de x módulo t. Nótese que f(x) sería el último dígito de x si lo escribimos en base diez. Los
resultados de aplicar la función a cada elemento del conjunto C se ven en la tabla 1:

Tabla 1. Evaluación de la función f(x)=|x| % t sobre un conjunto de 30 valores

x f (x) x f (x) x f (x)

11 1 43 1 80 0
95 5 21 3 83 3
36 6 75 1 44 4
96 6 53 5 34 4
42 2 58 3 98 8
38 8 55 8 41 1
39 9 25 5 50 0
32 2 99 5 69 9
49 9 12 9 66 6
24 4 68 2 46 6

Fuente: Sotelo (s.f.)

Se configurarán t listas identificadas con índices enteros de 0 a t - 1 (es decir, de 0 a 9). Ahora, cada
elemento x del conjunto C es insertado en la lista cuyo número sea calculado por medio de la función
f(x), este resultado se puede apreciar en la tabla 2:

POLITÉCNICO GRANCOLOMBIANO 2
Tabla 2. Listas de elementos correspondientes a los resultados posibles de evaluar f(x), t=10

Número de lista Valores que contiene la lsita


0 〈80, 50〉
1 〈11, 21, 41〉
2 〈42, 32, 12〉
3 〈43, 53, 83〉
4 〈24, 44, 34〉
5 〈95, 75, 55, 25〉
6 〈36, 96, 66, 46〉
7 〈 〉
8 〈38, 58, 68, 98 〉
9 〈 39, 49, 99, 69 〉

Fuente: Sotelo (s.f.)

Si cambia el valor de t por el de 20 y se mantiene la misma función f(x), la distribución de las listas
cambiaría como lo muestra la tabla 3:

Tabla 3. Listas de elementos correspondientes a los resultados posibles de evaluar f(x), t=20

Número de lista Valores que contiene la lsita


0 〈80〉
1 〈21, 41〉
2 〈42〉
3 〈43, 83〉
4 〈24, 44〉
5 〈25〉
6 〈66, 46〉
7 〈 〉

POLITÉCNICO GRANCOLOMBIANO 3
Número de lista Valores que contiene la lsita
8 〈68〉
9 〈49, 69〉
10 〈50〉
11 〈11〉
12 〈32, 12〉
13 〈53〉
14 〈34〉
15 〈95, 75, 55〉
16 〈36, 96〉
17 〈〉
18 〈38, 58, 98〉
19 〈39, 99〉

Fuente: Sotelo (s.f.)

Conforme t aumenta, cada una de las t listas va a quedar con menos elementos. En particular, cuando
t=100 en el ejemplo, ¡cada valor queda en su propia lista sin compartirla con ningún otro elemento!

A este tipo de estructuras de datos se les llama tablas hash, y la función que se aplicó para
determinar la fila asociada con cada elemento se denomina función hash. Si el número de listas se
configura adecuadamente, es improbable que dos valores compartan la misma fila, lo que aseguraría
operaciones básicas de búsqueda, inserción y eliminación con complejidad temporal O(1). Pero, si
el número de listas resulta ser muy pequeño comparado con la cantidad de datos en el conjunto, las
mismas operaciones terminarían siendo O(n).

POLITÉCNICO GRANCOLOMBIANO 4
2. Conceptos básicos 1

2.1. Funciones hash

Dado un tipo de datos C, una función hash es una función: f:C →Z que toma como parámetro un
valor de tipo C para entregar como resultado un número entero. Algunos ejemplos de tablas hash
sobre el conjunto de los números enteros se ofrecen en la tabla 4:

Tabla 4. Algunas funciones hash sobre el conjunto de los enteros (C=)

Fuente: Sotelo (s.f.)

Por otro lado, para diseñar funciones hash sobre cadenas de texto, es necesario conocer cómo son
codificados los caracteres en el lenguaje de programación. El estándar de codificación de caracteres
Unicode es el utilizado por Java para representar los caracteres de las cadenas de texto, permitiendo
el uso de símbolos especiales como vocales tildadas, operadores matemáticos, letras del alfabeto
griego e ideogramas chinos, entre otros. La tabla 5 contiene varios ejemplos de funciones hash sobre
cadenas de caracteres:

1 La teoría expuesta en esta sección, como el resto del documento, es una adaptación del texto de Sotelo (s.f.) que a su vez se inspiró para este
apartado en Villalobos (1996) y en Joyanes (2005).

POLITÉCNICO GRANCOLOMBIANO 5
Tabla 5. Algunas funciones hash sobre cadenas de texto (C =)

Fuente: Sotelo (s.f.)

Cómo mejorar...
Repase el tema de tipos de datos primitivos, en particular, el tipo de dato char visto en el
módulo de Programación de Computadores y la forma en que se utiliza el estándar Unicode
para relacionar símbolos y códigos numéricos.

¿Sabía que...?
En Java, para dotar todos los objetos de una clase
con una función hash, se debe reescribir el método
hashCode().

POLITÉCNICO GRANCOLOMBIANO 6
2.2. Tablas hash

Se define una tabla hash como una estructura de datos que está conformada por un arreglo de listas y
por una función hash, donde el arreglo de listas puede ser visto como una tabla donde cada una de las
listas corresponde a una fila. La figura 1 representa gráficamente un ejemplo de tabla hash:

Figura 1. Estructura general de una tabla hash representada por medio de un ejemplo
Fuente: Sotelo (s.f.)

En general, las tablas hash sirven para representar conjuntos y las funciones hash tienen como
propósito asociarle exactamente una fila a cada uno de los valores del conjunto.

2.3. Otras definiciones

2.3.1. Fila

Es una lista de la tabla hash.

2.3.2. Capacidad

Es el número de filas de la tabla hash. A lo largo de la lectura, se representará la capacidad de la tabla


hash con la variable t.

POLITÉCNICO GRANCOLOMBIANO 7
2.3.3. Tamaño

Es la cantidad de elementos almacenados en la tabla hash. A lo largo de la lectura, se representará el


tamaño de la tabla hash con la variable n.

2.3.4. Factor de carga

Es una medida de qué tan llena se encuentra la tabla hash. Se calcula como el tamaño de la tabla
dividido por la capacidad de la tabla. A lo largo de la lectura, se representará el factor de carga de la
tabla hash con la variable ϕ.
ϕ = n/t

2.3.5. Dirección

Dado un valor x de tipo C, la dirección de x en la tabla hash se define como el resultado de la expresión
|f(x)|%t donde f es la función hash y t es la capacidad de la tabla. La dirección de un elemento indica
cuál fila de la tabla hash se le asocia, y siempre es un número natural entre 0 y t - 1. La dirección 0
corresponde a la primera fila de la tabla hash, la dirección 1 a la segunda, …, y la dirección t – 1 a la última.

2.3.6. Colisión

Dos elementos x1 y x2 de tipo C colisionan si y solo si tienen la misma dirección en la tabla hash, lo
que sucede cuando |f(x1)|%t es igual a |f(x2)|%t. Una colisión sucede cuando se intenta insertar un
elemento en una fila que ya tiene datos.

2.4. Consideraciones y ejemplos de los conceptos básicos

La tabla 6 muestra dos ejemplos de tablas hash y lo caracteriza a partir de sus atributos básicos:

POLITÉCNICO GRANCOLOMBIANO 8
Tabla 6. Ejemplos de tablas hash y su caracterización

Número de lista Valores que contiene la lsita

Propiedad Valore
Función de Hashing f(x)
Capacidad t=5
Tamaño n = 30
Factor de carga ϕ = n/t =30/5 =6.00 = 600%
Dirección de x en la tabla |f(x)|%t = |x|%5
Elementos que colisionan Todos (30 en total)

Propiedad Valore
Función de Hashing f(x)
Capacidad t = 10
Tamaño n = 30
Factor de carga ϕ = n/t =30/10 =3.00 = 300%
Dirección de x en la tabla |f(x)|%t = |x|%10
Elementos que colisionan Todos (30 en total)

Fuente: Sotelo (s.f.)

Nótense las siguientes relaciones de proporcionalidad que se pueden deducir de la fórmula ϕ = n/t:

• Entre más filas (mayor capacidad) tenga la tabla hash, menor será el factor de carga y menor
será la probabilidad de que sucedan colisiones.

• Entre más datos (mayor tamaño) tenga la tabla hash, mayor será el factor de carga y mayor será
la probabilidad de que sucedan colisiones.

POLITÉCNICO GRANCOLOMBIANO 9
Cuando la capacidad es igual al tamaño, se tiene un factor de carga de 100% de acuerdo a la fórmula
ϕ =n/t = n/n= 1. Evidentemente, si el factor de carga supera el 100% entonces hay más datos que
filas (n>t) y con plena seguridad habrá colisiones en la tabla hash. Para que las tablas hash no se llenen
excesivamente ni se degeneren, es necesario evitar a toda costa que el factor de carga supere cierto
umbral ϕmax, que se definirá subjetivamente como ϕmax = 3/4 =0 .75=75%. Si se consigue asegurar
que el factor de carga siempre sea menor o igual que el umbral del 75%, no habrá muchas colisiones
y se podrá contar con un buen desempeño en las operaciones de búsqueda, inserción y eliminación,
con complejidad temporal O(1) siempre y cuando la función hash esté bien configurada.

3. Recomendaciones de diseño de tablas hash


Las siguientes son recomendaciones que permiten usar tablas hash sin degradar la eficiencia
en su funcionamiento:

• Configurar adecuadamente la capacidad inicial (t) de la tabla hash para que las operaciones
básicas de búsqueda, inserción y eliminación de datos sean eficientes, porque, de lo contrario,
la tabla se podría comportar como una lista en la que la complejidad de dichas operaciones se
degrada a O(n). Como ya se ha dicho, la capacidad inicial debería ser mayor o igual a cuatro
tercios la máxima cantidad de datos (n) que se piensa almacenar en la tabla hash.

• Entre mayor sea la capacidad de la tabla hash, mayor será la eficiencia de las operaciones
básicas; no obstante, se sacrificará más memoria RAM. Es importante no abusar de la memoria
RAM para aumentar indiscriminadamente la capacidad de la tabla hash. En todo caso, se debe
analizar cuidadosamente cuánta RAM se podría dar a la tabla, de tal forma que no se desperdicie
y que se cumpla la recomendación de la capacidad inicial.

• Si por algún motivo se calculó mal la capacidad inicial de la tabla hash, eventualmente el factor
de carga superará el umbral del 75% y será necesario aplicar algún correctivo de emergencia
para disminuirlo. Este correctivo se llama redimensionamiento dinámico (rehashing) y consiste
en crear una nueva tabla hash con el doble de capacidad (por ejemplo) y con la misma función
hash, trasladar los elementos de la vieja tabla a la nueva tabla conforme a la nueva capacidad,
y desechar la vieja tabla. La anterior operación es tremendamente ineficiente, porque reubica
todos los elementos almacenados, por lo que no se debe aplicar sino cuando se supere el umbral
del 75%. Nótese que, al duplicar la capacidad en estos casos, el factor de carga se reduciría a la
mitad, quedando aproximadamente en 37.5%.

POLITÉCNICO GRANCOLOMBIANO 10
• Por su naturaleza, en una tabla hash los elementos no se guardan de forma ordenada. Si se desea
mantenerlos ordenados de acuerdo a alguna relación de orden, debería usarse un árbol binario
ordenado como los árboles AVL o como los árboles rojinegros, en vez de una tabla hash.

Tabla 7. Criterios para diseñar una buena función hash

Criterio Descripción
Para todo elemento x de tipo el valor f (x) debe ser momento. Si un
Constante a lo largo del dato x está presente dentro de la Tabla de Hashing y f (x) cambia,
tiempo entonces el algoritmo de búsqueda no sería capaz de encontrarlo y el
algoritmo de eliminación no sería capaz de removerlo.
La función de Hashing debe dar resultados que se distribuyan en
un rango amplio de valores. Si la función tuviera un rango limitado,
entonces los datos serían acumulados en unas pocas filas de la Tabla
Entrega valores dispersos de Hashing. Pero si la función tuviera un rango disperso, se esperaría
que los datos se distribuyan uniformemente en todas las filas de la
tabla, logrando que posean aproximadamente el mismo tamaño y que
disminuya el número de colisiones.
La función de Hashing debe ser fácil de calcular. Si la función
requiriera de operaciones complejas, se emplearía gran cantidad de
tiempo computándola, lo que afectaría negativamente el desempeño
Fácil de calcular
de las operaciones básicas. Es preferible diseñar una función cuya
evaluación sea veloz y que distribuya los valores razonablemente, que
una función lenta que garantice dispersión perfecta.

Fuente: Sotelo (s.f.)

• Si no se implementa adecuadamente la función hash, puede suceder que las operaciones básicas
se vuelvan ineficientes, independientemente de cómo se haya configurado la capacidad de la
tabla. Por ejemplo, si la función de hash es f(x) = 0, todos los elementos serían puestos en la
primera fila, sin importar la cantidad de filas que la tabla posea. La tabla 7 muestra los principales
criterios para diseñar una función hash de manera apropiada.

POLITÉCNICO GRANCOLOMBIANO 11
4. Técnicas de diseño de funciones hash
Además de los criterios que fueron introducidos en la sección inmediatamente anterior, se pueden
enumerar varias técnicas para distribuir los valores en la tabla hash como lo muestra la tabla 8:

Tabla 8. Técnicas para distribuir los valores de una función hash sobre su respectiva tabla

Técnica Algoritmo para hallar la dirección de un valor x en la tabla Hashing

Se evalúa la fórmula l f(x) l %t. Es aconsejable usar un t que sea número


Funciones de división primo pues así se garantiza una mavor dispersión en los resultados
de la función.

Se evalúa l f(x) l se representa en base binaria o decimal, y se le quitan


Funciones de
dígitos en cierto orden preestablecido hasta que se obtenga un número
truncamiento
menor que t.

Se evalúa l f(x) lse representa en base decimal, se parte en pedazos que


tengan la misma cantidad de dígitos (salvo el último pedazo, que puede
Funciones de
tener menos dígitos), y finalmente se suman o se multiplican estos
plegamiento
pedazos. Mientras el número obtenido no sea menor que t, el proceso
se repite con pedazos cada vez más pequeños.

Fuente: Sotelo (s.f.)

La tabla 9 muestra un ejemplo por cada una de las técnicas de distribución de valores en una tabla hash.

POLITÉCNICO GRANCOLOMBIANO 12
Tabla 9. Ejemplos de las técnicas para distribuir los valores de una función hash sobre su respectiva tabla

Técnica Ejemplo de la aplicación de la técnica


Hallando el valor l f(x) l 10000 obtenemos la dirección 2354:
Funciones de división
l f(x) l%10000 = l 51273563164523554 l%10000 = 2354.
Quitnado alternadamente dígitos del valor l f(x) l obtenemos la
dirección 5312: 5127356316452354
Funciones de 52361425
truncamiento 52361425
5312
5312
Dividiendo el valor l f(x) l en pedazos de cuatro digitos que se suman,
obtenemos la dirección 1277:
Funciones de
plegamiento 5127 + 3563 + 1645 + 2354 =12689
1268 + 9 = 1277

Fuente: Sotelo (s.f.)

5. Operaciones básicas

5.1. Algoritmo de búsqueda

Para determinar si un valor x está presente en la tabla hash:


A. Sea r el resultado de la función hash evaluada sobre el objeto x.
B. Sea dir la dirección de x, calculada como el valor absoluto de r módulo la capacidad de la
tabla (nótese que se está usando la función de división).
C. Si x está presente en la fila ubicada en la posición dir de la tabla hash, retorne true. De lo
contrario, retorne false.

La complejidad temporal es O(n) cuando la función hash está mal diseñada y la búsqueda termina
inspeccionando una fila que concentra la mayoría de los elementos albergados en toda la tabla.
Por otro lado, si la función hash fuese difícil de calcular, el desempeño del algoritmo quedaría sujeto a
la eficiencia de dicha función.

POLITÉCNICO GRANCOLOMBIANO 13
Si la función hash está bien diseñada entonces es fácil de calcular y distribuye los valores
uniformemente, asegurando pocas colisiones y, por ende, una complejidad temporal de O(1) en el
proceso de búsqueda.

5.2. Algoritmo de inserción

Para insertar un valor x en la tabla hash:

A. Sea r el resultado de la función hash evaluada sobre el objeto x.

B. Sea dir la dirección de x, calculada como el valor absoluto de r módulo la capacidad de la tabla
(nótese que se está usando la función de división).

C. Si x no está presente en la fila ubicada en la posición dir de la tabla hash, entonces x se inserta
precisamente en esta fila. De lo contrario, no se altera la tabla.

La complejidad temporal es O(n) en los siguientes escenarios:

• Cuando la función hash está mal diseñada y la inserción termina operando sobre una fila que
concentra la mayoría de los elementos albergados en toda la tabla.

• Cuando después de efectuar la inserción el factor de carga supera el umbral, pues se terminaría
ejecutando un redimensionamiento dinámico.

Nuevamente, si la función hash fuese difícil de calcular, el desempeño del algoritmo quedaría sujeto a
la eficiencia de dicha función.

Si la función hash está bien diseñada, entonces, es fácil de calcular y distribuye los valores
uniformemente, asegurando pocas colisiones y, por ende, una complejidad temporal de O(1) en el
proceso de inserción, suponiendo que el factor de carga no supera el umbral después de la operación.

POLITÉCNICO GRANCOLOMBIANO 14
5.3. Algoritmo de eliminación

Para eliminar un valor x de la tabla hash:

1. Sea r el resultado de la función hash evaluada sobre el objeto x.

2. Sea dir la dirección de x, calculada como el valor absoluto de r módulo la capacidad de la tabla
(nótese que se está usando la función de división).

3. Si x está presente en la fila ubicada en la posición dir de la tabla hash, entonces x se elimina
precisamente de esta fila. De lo contrario, no se altera la tabla.

La complejidad temporal es O(n) cuando la función hash está mal diseñada y la eliminación termina
operando sobre una fila que concentra la mayoría de los elementos albergados en toda la tabla. Como
en las ocasiones anteriores, si la función hash fuese difícil de calcular, el desempeño del algoritmo
quedaría sujeto a la eficiencia de dicha función.

Si la función hash está bien diseñada, entonces, es fácil de calcular y distribuye los valores
uniformemente, asegurando pocas colisiones y, por ende, una complejidad temporal de O(1) en el
proceso de eliminación.

En síntesis...

Dado un tipo de datos C, una función hash es una función f:C →Z que toma como parámetro
un valor de tipo C para entregar como resultado un número entero.

Se define una tabla hash como una estructura de datos que está conformada por un arreglo de
listas y por una función hash, donde el arreglo de listas puede ser visto como una tabla donde
cada una de las listas corresponde a una fila.

Una fila es una lista de la tabla hash.

POLITÉCNICO GRANCOLOMBIANO 15
En síntesis...

La capacidad, t, de una tabla hash es el número de filas.

Tamaño es la cantidad de elementos almacenados en la tabla hash. A lo largo de la lectura, se


representa el tamaño de la tabla hash con la variable n.

Factor de carga es una medida de qué tan llena se encuentra la tabla hash. Se calcula como el
tamaño de la tabla dividido por la capacidad de la tabla. A lo largo de la lectura, se representa el
factor de carga de la tabla hash con la variable ϕ.

Dado un valor x de tipo C, la dirección de x en la tabla hash se define como el resultado de la


expresión |f(x)|%t, donde f es la función hash y t es la capacidad de la tabla.

Una colisión sucede cuando se intenta insertar un elemento en una fila que ya tiene datos.

Entre más filas (mayor capacidad) tenga la tabla hash menor será el factor de carga y menor
será la probabilidad de que sucedan colisiones. Por otro lado, entre más datos (mayor tamaño)
tenga la tabla hash mayor será el factor de carga y mayor será la probabilidad de que sucedan colisiones.

Las tres técnicas que se usan típicamente para diseñar funciones hash son funciones de división,
funciones de truncamiento y funciones de plegamiento.

Si la función hash está bien diseñada, entonces las operaciones de búsqueda, eliminación e
inserción tienen una complejidad temporal de O(1).

POLITÉCNICO GRANCOLOMBIANO 16
Referencias
Joyanes, L., Fernández, M., Sánchez, L., & Zahonero, I. (2005). Estructuras de datos en C. Madrid:
McGraw-Hill.

Sotelo, A. (s.f.). Tablas de hashing. Bogotá, Colombia.

Villalobos, J. (1996). Manejo de estructuras de datos en C. Bogotá: McGraw-Hill.

Referencias de imágenes y tablas


Sotelo, Alejandro. (s.f.). Algunas funciones de Hashing sobre el conjunto de los números enteros
(C=Z). Recuperado de https://poli.instructure.com/courses/67/files/2405?module_item_id=2150

Sotelo, Alejandro. (s.f.). Algunas funciones de Hashing sobre el tipo de datos de las cadenas de texto
(C=String). Recuperado de https://poli.instructure.com/courses/67/files/2405?module_item_
id=2150

Sotelo, Alejandro. (s.f.). Algunas Tablas de Hashing con distintas capacidades, que representan el
conjunto de números enteros < 11, 95, 36, 96, 42, 38, 39, 32, 49, 24, 43, 21, 75, 53, 58, 55, 25,
99, 12, 68, 80, 83, 44, 34, 98, 41, 50, 69, 66, 46>. Recuperado de https://poli.instructure.com/
courses/67/files/2405?module_item_id=2150

Sotelo, Alejandro. (s.f.). Criterios que deben satisfacer las funciones de Hashing para un buen
desempeño de la Tabla de Hashing. Recuperado de https://poli.instructure.com/courses/67/
files/2405?module_item_id=2150

Sotelo, Alejandro. (s.f.). Diez listas donde cada elemento x del conjunto C es insertado en la lista de
la posición f(x)=|x|%10. Recuperado de https://poli.instructure.com/courses/67/files/2405?module_
item_id=2150

Sotelo, Alejandro. (s.f.). Ejemplos sobre las técnicas de la tabla anterior, suponiendo que
f(x)=5127356316452354 y que t=10000. Recuperado de https://poli.instructure.com/courses/67/
files/2405?module_item_id=2150

Sotelo, Alejandro. (s.f.). Evaluación de la función f(x)=|x|%10 sobre los treinta valores del conjunto C.
Recuperado de https://poli.instructure.com/courses/67/files/2405?module_item_id=2150

POLITÉCNICO GRANCOLOMBIANO 17
Sotelo, Alejandro. (s.f.). Técnicas típicas para distribuir los valores de una función de Hashing entre
0 y t-1, donde t es la capacidad de la tabla. Recuperado de https://poli.instructure.com/courses/67/
files/2405?module_item_id=2150

Sotelo, Alejandro. (s.f.). Una Tabla de Hashing con un arreglo de listas de tamaño 10 y una función
de Hashing específica [Diagrama]. Recuperado de https://poli.instructure.com/courses/67/
files/2405?module_item_id=2150

Sotelo, Alejandro. (s.f.). Veinte listas donde cada elemento x del conjunto C es insertado en la lista de
la posición f(x)=|x|%20. Recuperado de https://poli.instructure.com/courses/67/files/2405?module_
item_id=2150

POLITÉCNICO GRANCOLOMBIANO 18
INFORMACIÓN TÉCNICA

Módulo: Estructuras de Datos


Unidad 4: Tablas hash y grafos
Escenario 7: Tablas hash

Autor: Javier Fernando Niño Velásquez

Asesor Pedagógico: Juan Pablo Sierra Penagos


Diseñador Gráfico: Nicolás Jiménez Osorio
Asistente: Ginna Quiroga

Este material pertenece al Politécnico Grancolombiano.


Prohibida su reproducción total o parcial.

POLITÉCNICO GRANCOLOMBIANO 19

También podría gustarte