Sie sind auf Seite 1von 4

Tabla Hash en c++

Publicado por rogikato / en 06:43 / /

"Hashing" es una tcnica que busca realizar las operaciones de insercin, eliminacin y bsqueda en tiempo constante. Esa caracterstica es muy importante cuando se traba con almacenamiento secundario en disco, donde el acceso a una determinada direccin es bastante lenta. Algunas aplicaciones que son beneficiadas por el uso de tablas hash son diccionarios y tablas de palabras reservadas de un compilador. En vez de organizar la tabla segn el valor relativo de cada llave en relacin a las dems, la tabla hash toma encuenta solamente su valor absoluto, interpretado como un valor numrico.

Si consiguisemos asociar a cada elemento a ser almacenado un nmero como en el ejemplo anterior, podremos realizar las operaciones de insercin, eliminacin y bsqueda en tiempo constante. La funcin que asocia a cada elemento de un conjunto U un nmero que sirva de ndice en una tabla (array) es llamada de funcin hash. Una funcin hash debe satisfacer las siguientes condiciones: 1. Ser simple de calcular

2. Asegurar que elementos distintos posean ndices distintos. 3. Generar una distribucin equilibrada para los elementos dentro del array.

Funciones Hash
Crear una funcin hash satisfaciendo las condiciones anteriores no siempre es una tarea fcil. Existen mucho modelos de creacin para funciones hash. A continuacin se presentan apenas dos formas de creacin de funciones hash. en "Cormen,T.H. Leiserson C.E., Rivest R.L. Introduction to Algorithms" pueden ser encontraod varios ejemplos afines hash. Una buena funcin hash es aquella en que toda entrada (slot) del array posee la misma probabilida de ser alcanzado por la funcin.

Mtodo da Divisin El mtodo de la divisin consiste en los siguiente: suponga que los elementos x que deben ser almacenados sean nmeros enteros, una funcin hash que puede ser utilizada para distribuir tales nmeros en un array (tabla hash) es: h(x)=x% (tamao de la tabla) Implementacin La siguiente funcin describe la implementacin de la funcin hash descrita anteriormente para el caso de strings. int Hash(char *a, int stringsize) { int hashval, j; hashval = (int) a[0]; for (j = 1; j < stringsize; j++) hashval += (int) a[j]; return(hashval % tablesize); /* suponiendo que tablesize es global */ } Mtodo del Doblado En este mtodo, las llaves son interpretadas como una secuencia de dgitos escritos en un pedazo de papel. Ello consiste en "doblar" ese papel, de manera que los dgitos se superpongan sin llevar en consideracin el "se lleva uno" como se muestra en la siguiente figura.

El proceso es repetido hasta que los dgitos formen un nmero menor al del tamao de la tabla hash.

Es importante resaltar que el metodo de doblar tambien puede ser usado con nmeros binarios. En este caso, en vez de la suma, se debe realizar una operacin de "OR exclusivo", pues operaciones de "AND" y de "OR" tienden a producir direcciones-base concentrados al final o al inicio de la tabla.

Colisiones
Por ms que se intente encontrar una funcin hash eficiente, en aplicaciones prcticas es difcil conseguir evitar el problema de colisiones de llaves. As, se vuelve necesario estudiar alternativas para este problema. Existen varias formas de resolver el problema de colisiones, dentro de ellas destacamos: Existen varias formas de resolver el problema de colisiones, dentro de ellas destacamos: Encadenamiento Separado o Externo (Separate Chaining) En el encadenamiento separado colocamos los elementos que poseen llaves iguales en una listas encadenada.

Utilizando esta estrategia, no es difcil percibir que en el peor de los casos el tiempo para insertar un nuevo elemento en la tabla es de O(1). La bsqueda por un elemento, toma el tiempo proporcional al tamao de la lista almacenada en cada slot. Encadenamiento Interno Encadenamiento interno es un mtodo para resolver problemas de colisiones mediante el empleo de listas encadenadas que comparten el mismo espacio de memoria al de la tabla de distribucin. El encadenamiento interno prevee la divisin de la tabla T en dos zonas, una de direccin-base, de tamao p, y otra reservada para colisiones, de tamao s. Naturalmente, p+s = m, donde m corresponde al tamao de la tabla hash.

Un problema de esta tcnica es que ella puede provocar colisiones secundaria, eso quiere decir, que puede provocar colisiones provenientes de la coincidencia de direcciones para llaves que no son sinnimas. Este fue el caso ocurrido en al figura anterior cuando se intent insertar el nmero 02. En la direccin base de este nmero ya se encontraba el nmero 14, el cual no es sinnimo de 02. Otra dificultad de esta tcnica se encuentra en la funcin de eliminacin de un elemento. Es necesario tomar cuidado en este procedimiento para que la llamada de bsqueda y eliminacin futuras no retornen falsos resultados. Por qu? Cuando estudiamos la tcnica de direccionamiento abierto, veremos una solucin para este problema.

http://codigodeprogramacion.blogspot.mx/2009/10/tabla-hash-en-c.html

Das könnte Ihnen auch gefallen