Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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:
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
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
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
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〉
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
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:
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 =)
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.1. Fila
2.3.2. Capacidad
POLITÉCNICO GRANCOLOMBIANO 7
2.3.3. Tamaño
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.
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
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)
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.
• 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.
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.
• 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
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
5. Operaciones básicas
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.
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.
• 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
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.
POLITÉCNICO GRANCOLOMBIANO 15
En síntesis...
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 ϕ.
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, 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
POLITÉCNICO GRANCOLOMBIANO 19