Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tabla Hash
Tabla Hash
INTRODUCCIN
- Intuitivamente, una tabla es una coleccin de elementos, cada uno de los cuales tiene una clave y una informacin
asociada.
- Esta aproximacin consiste en proceder, no por comparaciones entre valores clave, sino encontrando alguna
funcin h(k), funcin de dispersin, que nos d directamente la localizacin de la clave k en la tabla.
- La funcin de dispersin se aplica a lo que habitualmente se denomina como la clave del elemento (y que en
ocasiones ser l mismo). Se denomina valor de dispersin al valor h(clave_de_x), y cubetas a las clases. Se dice que x
pertenece a la cubta de h(clave_de_x).
- El objetivo ser encontrar una funcin hash que provoque el menor nmero posible de colisiones (ocurrencias de
sinnimos), aunque esto es solo un aspecto del problema, el otro ser el de disear mtodos de resolucin de colisiones
cuando stas se produzcan.
CLASE ABSTRACTA
template <class B, class H, class T>
class hashTable {
friend class hashTableIterator<B, H, T>;
public:
// constructores
buckets[i]->deleteAllValues();
}
delete itr;
}
itr = 0; // no hay ms elementos
return false;
}
hashListIterator<T>::hashListIterator
(const hashListIterator<T> & source)
: hashTableIterator<setList<T>, T, T>(source)
{
}
OTRAS REPRESENTACIONES
Representacin Basada en Diccionarios
template <class H, class T>
class hashDictionary
: public hashTable<dictionaryList<H, T>, H,
association<H, T> *> {
public:
// constructores
hashDictionary (const unsigned int & max,
unsigned int (*f) (const H &));
hashDictionary (const unsigned int & max,
unsigned int (*f) (const H &), const T & initial);
hashDictionary (const hashDictionary<H, T> & source);
// operacin de acceso
T & operator [] (const H & key);
// test de pertenencia
bool includesKey (const H & key) const;
// operacin de borrado
void removeKey (const H & key);
protected:
virtual iterator<association<H, T> *> *
makeIterator (const unsigned int & i);
};
Nmero de
colisiones
hashVector<H, T>::hashVector
(const hashVector<H,T> & source)
: data(source.tablesize), erase(source.erase),
hashfun(source.hashfun), rhashfun(source.rhashfun),
numberOfSlots(source.numberOfSlots),
numberOfElements(source.numberOfElements),
tablesize(source.tablesize), initial(source.initial)
{
for (unsigned int i = 0; i < tablesize; i++)
if (source.data[i])
data[i] = new association<H, T>(*source.data[i]);
else
data[i] = 0;
}
}
}
// insertar clave y valor por defecto
data[pos] = new association<H,T>(aKey, initial);
if (erase[pos])
erase[pos] = false;
else
numberOfSlots--;
numberOfElements++;
return data[pos]->valueField;
}
/*
*/
*/
swap(v, 0, i);
/*
*/
reorganize(v, 0, i-1);
}
}
Est mal la
raz
FUNCIONES HASH
HASHING MULTIPLICATIVO
- Esta tcnica trabaja multiplicando la clave k por s misma o por una constante, usando despus alguna porcin de
los bits del producto como una localizacin de la tabla hash.
BORRADOS Y REHASHING
- Cuando intentamos borrar un valor k de una tabla que ha sido generada por dispersin cerrada, nos encontramos
con un problema. Si k precede a cualquier otro valor k en una secuencia de pruebas, no podemos eliminarlo sin ms, ya
que si lo hiciramos, las pruebas siguientes para k se encontraran el "agujero" dejado por k por lo que podramos concluir
que k no est en la tabla, hecho que puede ser falso.
- La solucin es que necesitamos mirar cada localizacin de la tabla hash como inmersa en uno de los tres posibles
estados: vaca, ocupada o borrada, de forma que en lo que concierne a la bsqueda, una celda borrada se trata exactamente
igual que una ocupada. En el caso de las inserciones, podemos usar la primera localizacin vaca o borrada que se
encuentre en la secuencia de pruebas para realizar la operacin.
- Cuando una tabla llega a un desbordamiento o cuando su eficiencia baja demasiado debido a los borrados, el
nico recurso es llevarla a otra tabla de un tamao ms apropiado, no necesariamente mayor, puesto que como las
localizaciones borradas no tienen que reasignarse, la nueva tabla p odra ser mayor, menor o incluso del mismo tamao
que la original. Este proceso se suele denominar rehashing y es muy simple de implementar si el arca de la nueva tabla es
distinta al de la primitiva, pero puede complicarse bastante si deseamos hacer un re hashing en la propia tabla.
RESOLUCIN DE CONFLICTOS
MEDIANTE REDISPERSIN
- Supongamos la siguiente figura:
- Imaginemos que queremos introducir en la tabla un nuevo dato cuya clave es 596397. Utilizando una funcin de
dispersin,
f (k) = k % 1000
obtenemos f (596397) = 397. Por lo tanto, el dato habr que almacenarlo en la posicin 397.
- Dicha posicin est ocupada por otro dato con clave distinta (4957397), por lo que el nuevo dato se deber insertar
en otra posicin.
- El mtodo ms simple consiste en realizar una bsqueda lineal de la siguiente posicin libre en el vector, es decir,
definir
h (k) = (k+1) % 1000
- Hay que exigir a la funcin h que produzca ndices uniformemente distribuidos en el intervalo 0, , n-1 (siendo n
el nmero de elementos del vector).
MEDIANTE ENCADENAMIENTO
- Este mtodo consiste en permitir mltiples claves de registros en una misma posicin. En este caso existen dos
posibilidades:
1. Que cada direccin calculada contenga espacios para mltiples pares, en vez de un nico par. Cada una de estas
posiciones se denomina cubo.
2. Otra solucin, es usar la direccin calculada, no como posicin real del registro, sino como el ndice en un vector
de listas enlazadas. Cada posicin del vector accede a una lista de pares que comparten la misma direccin.
- Para buscar un registro dado, aplicamos primero la funcin hash a su clave y luego buscamos la cadena para el
registro en la lnea. De este modo, si la lista es muy grande, se pierde la eficiencia del mtodo.