Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Algoritmos y
Estructura de
Datos I
1
Tablas hash
En las lecturas anteriores, se vieron distintas estructuras, tales como los
arreglos, las listas enlazadas, los árboles (binarios y AVL), etcétera.
Conceptos iniciales
Se necesita recordar qué es un arreglo, un vector o array. En lecturas
anteriores, se mencionó que es un tipo de estructura de datos estática
debido a que debe indicarse su tamaño en el momento de ser creado.
Cabe aclarar que los arreglos, en general, son estructuras que almacenan
elementos del mismo tipo, pero existen lenguajes que no son fuertemente
tipados, que permiten almacenar elementos de distintos tipos dentro de
los arreglos. Asimismo, la longitud de un array, en general, no es dinámica,
sino que permanece del mismo tamaño en que se creó. Sin embargo,
también existen lenguajes que modifican dinámicamente su tamaño. En
esta lectura, se trabajará considerando que los arreglos son estáticos y del
mismo tipo.
2
No importa cuán grande sea el vector y cuántos elementos se tengan
almacenados. Se podrá acceder a un elemento a través del índice en un
tiempo constante O(1).
Tablas hash
Se comenzará con un ejemplo usualmente usado para explicar esta
temática. Se supone que se tiene un arreglo v, donde, en cada posición de
este, se encuentran los datos de una persona, y donde se realizó la
asignación de un elemento en el arreglo usando de índice el DNI. Así, por
ejemplo, si el DNI de una persona es 33.555.777, se podrá acceder, de
manera unívoca, a los datos de esa persona usando la expresión:
3
Lo que se acaba de describir es una tabla hash.
Una tabla hash es una estructura de datos que permite almacenar elementos
en la misma y accederlos a través de relacionar una clave o key con un
elemento.
Funciones hash
Si se continúa con el ejemplo, la clave usada en este caso será el DNI de la
persona. Esto permite estimar que el vector deberá tener millones de
posiciones para que puedan almacenarse allí todas las personas.
Se dice que son deterministas porque, para una clave, la función dará por
resultado siempre el mismo valor.
Colisiones
Una colisión ocurre Ahora bien, se puede encontrar con una nueva problemática: ¿qué sucede
cuando la función hash si se obtiene el mismo índice para dos claves distintas? Esta problemática
arroja el mismo valor es conocida como colisión.
para dos claves
distintas o en
presencia de claves
Una colisión podría ocurrir cuando se tienen dos claves iguales. Si se usa el
idénticas. ejemplo anterior, se podría haber usado como clave el nombre de la
persona, en vez de su DNI. En ese caso, una persona con el mismo nombre
que otra persona tendrá la misma clave y, por ende, la función hash
calculará el mismo índice y generará una colisión, también. Las colisiones
son bastante comunes, porque es más la cantidad de elementos que la
cantidad de posiciones disponibles.
4
No es posible almacenar a dos personas en una misma posición de la tabla,
por lo que debe buscarse una alternativa. Estas alternativas se conocen
como métodos de resolución de colisiones. Existen varias y,
afortunadamente, son muy efectivas.
Inserción
Se hará uso del ejercicio que el autor Weiss propone, para explicar cómo
funcionan las inserciones en una tabla hash:
5
Figura 2: Representación gráfica de inserciones en una tabla hash usando
sondeo lineal
Búsqueda
6
Si se continúa con el ejemplo anterior, en el caso de buscar al valor 49, se
calcula su función hash obteniendo el índice 9. En este, vemos que no está
el valor buscado, por lo que se procede a buscar en la siguiente posición.
Como termina la estructura en la posición 9, se procede a inspeccionar en
la posición 0. Allí, se encuentra el valor buscado, por lo que termina el
proceso.
Eliminación
7
Aunque el porcentaje de ocupación de la tabla esté por debajo del 60 %, se
podrá observar un comportamiento no deseado, el cual es nombrado
como agrupamiento primario y agrupamiento secundario.
Sondeo cuadrático
Esta técnica surge para resolver la problemática del agrupamiento
primario. Consiste en que ante un valor H arrojado por la función hash, en
vez de hacer una exploración lineal ante una colisión, es decir, a través del
tránsito una a una de cada posición (H+1, H+2, ..., H+i), se realice una
exploración siguiendo la forma H+1, H+4, …, H+i2.
8
Si se analiza la primera inserción, la clave 89 será insertada en la posición 9,
ya que se encuentra disponible. La clave 18 podrá ser insertada en la
posición 8 sin problema, ya que no hay colisión. La clave 49 presenta una
colisión en la posición 9, por lo que se procede a evaluar la disponibilidad
de la siguiente posición. Como está libre, se lo asigna en la posición 0.
Ahora bien, ante la clave 58, la situación es distinta: el índice arrojado por
la función es 9, pero ocurre una colisión, por lo que se procede a verificar la
siguiente posición y se obtiene una nueva colisión. Se evalúa la posición
8+i^2 = 8+4. Entonces, si se considera que el recorrido es circular, se
cuenta a partir de la posición 8, 4 posiciones más, y se llega a la posición 2.
Dicha posición está disponible, por lo que se almacena el elemento allí. Así,
se continúa el proceso para almacenar a todos los elementos. Esta técnica
resuelve el agrupamiento primario, pero produce un agrupamiento
secundario.
“En el sondeo cuadrático, los elementos cuyo valor hash corresponde a una
misma posición provocan un sondeo de las mismas celdas alternativas,
fenómeno que se conoce con el nombre de agrupamiento secundario”
(Weiss, 2013, p. 787).
Encadenamiento separado
Esta técnica resuelve las colisiones a través del uso de las listas en cada
posición de la tabla. Por lo que, cuando un elemento colisione, no se
buscará otra posición libre en la tabla, sino que se la añadirá en una lista
enlazada, almacenada en dicha posición.
9
Si bien se sabe que las búsquedas en las listas son operaciones lineales, si la
lista es pequeña, no se incurrirá en mucho tiempo y se mantendrá un
tiempo casi constante.
10
Referencias
Cormen, T., Leiserson, C., Rivest, R., & Stein, C. (2009). Hash Tables. En Autores,
Introduction to Algorithms (pp. 253-285). Massachusetts, USA: The MIT Press.
11