[ Estructura de Datos ] Ingeniera de Sistemas Tabla dispersa
Las tablas de dispersin o, simplemente tablas
hash, son estructuras de datos que se usan en aplicaciones que manejan una secuencia de elementos, de tal forma que cada elemento tiene asociado un valor clave, que es un nmero entero positivo perteneciente a un rango de valores, relativamente pequeo. En estas organizaciones, cada uno de los elementos ha de tener una clave que identifica de manera unvoca al elemento. Tabla dispersa
Por ejemplo, el campo nmero de matricula
del conjunto de alumnos puede considerarse un campo clave para organizar la informacin relativa al alumnado de una universidad. El nmero de matrcula es nico, hay una relacin biunvoca, uno a uno, entre el campo y el registro alumno. Puede suponerse que no existen, simultneamente, dos registros con el mismo nmero de matrcula. Problemas con Hash
Una funcin hash ideal, h(x), debe generar
direcciones distintas para dos claves distintas. No siempre es as, no siempre proporciona direcciones distintas; en ocasiones, ocurre que dadas dos claves diferentes x1, x2 h(x1) = h(x2). Este hecho es conocido como colisin, es evidente que el diseo una tabla dispersa debe proporcionar mtodos de resolucin de colisiones. Soluciones de Colisiones
Es importante tener en cuenta que la
resolucin de colisiones, en una tabla dispersa, afecta directamente a la eficiencia de las operaciones bsicas sobre la tabla: insertar, buscar y eliminar. Se consideran dos modelos para resolver colisiones: la exploracin de direcciones y el direccionamiento enlazado Exploracin de Direcciones
Los diversos mtodos de exploracin se
utilizan cuando todos los elementos, colisionados o no, se almacenan en la misma tabla. Las colisiones se resuelven explorando consecutivamente en una secuencia de direcciones hasta que se encuentra una posicin libre (un hueco) en la operacin de insertar o se encuentra el elemento buscado en las operaciones buscar y eliminar. Exploracin Lineal Es la forma ms primaria y simple de resolver una colisin entre claves, al aplicar una funcin de dispersin. Supngase que se tiene un elemento de clave x, la direccin que devuelve la funcin h(x) = p, si esta posicin ya est ocupada por otro elemento se ha producido una colisin. La forma de resolver est colisin con exploracin lineal consiste en buscar la primera posicin disponible que siga a p. La secuencia de exploracin que se genera es lineal: p, p+1, p+2, ... m-1, 0, 1, ... y as consecutivamente hasta encontrar una posicin vaca. La tabla se ha de considerar circular, de tal forma que siendo m-1 la ltima posicin, la siguiente es la posicin 0. Ejemplo: Exploracin Lineal
Se tienen 9 elementos cuyas claves simblicas son x1,
x2, x3, x4, x5, x6, x7, x8 y x9. Para cada uno la funcin de dispersin genera las siguientes direcciones: Exploracin cuadrtica
Suponiendo que a un elemento con clave x
le corresponde la direccin p y que la posicin de la tabla indexada por p est ocupada, el mtodo de exploracin o prueba cuadrtica busca en las direcciones p, p+1, p+4, p+9, ... p+i2, considerando la tabla como un array circular. El nombre de cuadrtica para esta forma de explorar se debe al desplazamiento relativo, i2 para valores de i= 1, 2, 3... Exploracin cuadrtica
Se dispone de 9 elementos cuyas claves simblicas son: x1,
x2, x3, x4, x5, x6, x7, x8 y x9. El tamao de la tabla donde se guardan es 17 (nmero primo), rango de 0 a 16. Para cada uno de los elementos la funcin de dispersin genera las direcciones: Direccionamiento enlazado
Una alternativa a la secuencia de
exploracin es el direccionamiento (hashing) enlazado. Se basa en utilizar listas enlazadas (cadenas de elementos), de tal forma que en cada lista se colocan los elementos que tienen la misma direccin hash. Todos los elementos que colisionan: h(x1) = h(x2) = h(x3) ... van a estar ubicados en la misma lista enlazada Ejemplo
La Figura muestra la estructura de datos
bsica para este mtodo de dispersin. La idea fundamental es la siguiente: si se ha elegido una funcin hash que genera direcciones en el rango 0 a m-1, se debe crear una tabla de m posiciones, indexada de 0 a m-1; cada posicin de la tabla contendr la direccin (referencia) de acceso a su correspondiente lista enlazada. Ejemplo