16
Materia: Algoritmos y Programaci´ on II HASHING Emiliano Castagnari 82930 Andr´ es de Barbar´ a 82497 Sebasti´ an Santisi 82069 2. do cuatrimestre 2003

Materia: Algoritmos y Programaci´on II HASHINGweb.fi.uba.ar/~ssantisi/works/hash/hash.pdf · sensiblemente la necesidad de resolver los hash clashes y, por lo tanto, gana en ve-locidad

  • Upload
    dotram

  • View
    222

  • Download
    0

Embed Size (px)

Citation preview

Materia: Algoritmos y Programacion II

HASHING

Emiliano Castagnari 82930Andres de Barbara 82497Sebastian Santisi 82069

2.do cuatrimestre 2003

INDICE

Indice

1. Hashing 21.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2. Resolviendo colisiones de hasheo por direccionamiento abierto . . . 31.3. Borrando elementos desde una tabla de hasheo . . . . . . . . . . . . 61.4. Tablas de hasheo encadenadas . . . . . . . . . . . . . . . . . . . . . 61.5. Eficiencia en los metodos de rehasheo . . . . . . . . . . . . . . . . . 71.6. Reordenamiento de la tabla de hasheo . . . . . . . . . . . . . . . . 91.7. Metodo de Brent . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.8. Arboles binarios de hasheo . . . . . . . . . . . . . . . . . . . . . . . 10

2. El Contenedor Asociativo de Hasheo de la Bibloteca Estandar dePlantillas (STL) 122.1. Tipos nuevos del Contenedor . . . . . . . . . . . . . . . . . . . . . . 122.2. Notacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.3. Definiciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.4. Funciones del Contenedor : . . . . . . . . . . . . . . . . . . . . . . . 132.5. Garantias de complejidad . . . . . . . . . . . . . . . . . . . . . . . . 132.6. Modelos en el contenedor : . . . . . . . . . . . . . . . . . . . . . . . 14

3. Bibliografıa 14

1

1 Hashing

1. Hashing

Hash, x. There is no definition for this word - nobody knows what hash is”AMBROSE BIERCE (The Devil’s Dictionaty, 1906)

1.1. Introduccion

Supongamos que tenemos un registro que se encuentra guardado en una tablacon una correspondiente clave. Es necesario para operar sobre ese dato, tener queanalizar cierto numero de estos registros antes de obtener el que estamos buscan-do. Para mejorar nuestro rendimiento y llevarlo a un nivel optimo nos convendrıaanalizar que distribucion en la tabla y que metodo de busqueda podrıamos usarpara no realizar comparaciones innecesarias.

Si queremos que cada clave sea devuelta en un solo acceso, entonces el lugarde cada registro en la tabla solo puede depender de una sola clave y no dependerde la localizacion de las otras claves como ocurre en un arbol. El metodo maseficiente de organizar tal tabla, es un arreglo donde cada registro es almacenado auna distancia especifica desde la base de este.

Por desgracia un sistema como el descrito anteriormente no es muy practico.Por ejemplo, pensemos en una companıa que tiene que administrar un stock de100 objetos diferentes, los cuales poseen un numero de serie de siete(7) dıgitos. Siusaramos indexacion directa necesitarıamos un arreglo de 10 millones de elementosy esto es claramente una perdida inaceptable de espacio.

Lo que necesitamos es un metodo que nos permita convertir una clave de unelemento en un entero que represente la distancia a la base del arreglo donde seencuentra el registro, y que, idealmente, no hallan dos claves que tengan el mismoregistro final.Desafortunadamente no existe tal metodo, pero intentemos entonces encontrar unoque se le acerque lo suficiente al ideal y determinemos que tipo de accion tomarcuando no se aproxima a este.

A la funcion que transforma un clave en un ındice de una tabla se le llamafuncion de hasheo (hash function). Si h es una funcion de hasheo y clave es unaclave entonces h(clave) es el hasheo de la clave. Si r es el registro cuya clave hasheaen hr, entonces hr es la clave de hasheo de r.

Supongamos ahora que una empresa que tiene 1000 partes diferentes en sustock y cada parte tiene un registro diferente. Entonces un arreglo indexado del 0al 1000 es suficiente para poder guardar todo el archivo de stock. Los ultimos tres

2

1.2 Resolviendo colisiones de hasheo por direccionamiento abierto

numeros del numero de registro de las partes nos va a servir como ındice de los losregistros en el arreglo.

El metodo anterior tiene una falla. Supongamos que dos claves, c1 y c2, sonaquellas tal que h(c1) y h(c2) son iguales. Claramente si c1 esta en la tabla, cuan-do se queramos incluir c2 se intentara acceder al el registro donde se encuentra c1.Dos registros no pueden ocupar la misma posicion. Cuando esto ocurre se llamacolision de hasheo (hash collision) o hash clash.

Hay dos formas basicas de resolver esto. La primera es llamada rehasheo (re-hashing), que incluye usar una funcion de hasheo secundaria en la clave de hasheodel registro. La segunda, llamada encadenamiento (chaining), construye una listaenlazada de todos los elementos cuyas claves hashean en el mismo ındice.

Mas alla de esto, cabe decir que una buena funcion de hasheo es aquella queminimizan las colisiones y distribuye de forma uniforme los registros. Dejar es-pacios en blanco en un arreglo es ineficiente en termino de espacio, pero reducesensiblemente la necesidad de resolver los hash clashes y, por lo tanto, gana en ve-locidad. Mas adelante mostraremos las diferencias de rendimiento entre una tablamedianamente llena y una tabla llena; este es un tema no menor que requiere bas-tante analisis.

Vale tambien destacar que el hecho de que hashing permita el acceso directo alos elementos de la tabla posee una falla muy seria. Los elementos de la tabla dehasheo no son guardados en forma secuencial por claves y no hay metodos practi-cos para obtener las claves en alguna secuencia dada.

1.2. Resolviendo colisiones de hasheo por direccionamien-to abierto

Un metodo simple para resolver colisiones de hasheo es el de poner el registroen la siguiente posicion disponible en el arreglo. Esta tecnica es llamada compro-bacion lineal(lineal probing) y es un ejemplo de un metodo general para resolvercolisiones de hasheo llamado rehasheo (rehashing) o direccionamiento abierto (openaddresing). En general una funcion de rehasheo, rh, acepta un ındice del arreglopara calcular otro. Si la posicion h(clave) del arreglo ya se encuentra ocupada porun registro con una clave diferente, rh es aplicada al valor de h(clave)para encon-trar otra posicion donde el registro pueda ser guardado. Si esta ultima posicion seencuentra tambien ocupada puede ser aplicada la funcion, nuevamente, para sabersı rh(rh(h(clave))) esta disponible.

3

1.2 Resolviendo colisiones de hasheo por direccionamiento abierto

Notemos que puede ocurrir que en el rehasheo nunca se encuentre una posiciondisponible por lo que se seguirıa intentando calcular sin ningun resultado infini-tamente. Esto puede pasar por dos motivos. Primero que la tabla este completa,lo cual es facilmente salvable contando las veces que se aplica la funcion y com-parando contra el total de elementos de la tabla. Segundo existen posiciones libresen la tabla pero la funcion de rehasheo nunca las toca. Consideremos la situaciondonde las los impares estan llenos, los pares vacıos, y la funcion de rehasheo solotoca los impares.

Una de las propiedades de la una buena funcion de rehasheo es aquella quepara cualquier ındice i, los sucesivos rehasheos rh(i),rh(rh(i)),etc, cubre enterosdesde 0 hasta el tamano de la tamtabla - 1.

Existe otra forma de medir la eficiencia de la funcion de rehasheo. Considere-mos el caso de un rehasheo lineal. Considerando que la funcion de hasheo produceındices de que son uniformemente distribuidos sobre intervalos de 0 y tamtabla -1. Cuando el arreglo esta vacıo veremos que cualquier registro sera ingresado enla tabla. Luego, que se hayan realizado varias entradas y algunas colisiones hayansido resueltas, lo anterior ya no sera cierto. El efecto en el cual dos claves quehashean en diferentes valores compiten entre ellas en sucesivos rehasheos se llamaagrupamiento primario (primary clustering).

De hecho las funciones que dependen exclusivamente de los ındices ha ser re-hasheados causan agrupamiento primario.

4

1.2 Resolviendo colisiones de hasheo por direccionamiento abierto

Una forma de resolver este problema es permitir que la funcion de rehasheodependa del numero de veces que la funcion fue aplicada a un valor particular dehasheo. De esta forma rh es una funcion de dos argumentos. rh(i,j) depende delentero de rehasheo i y de la clave que esta siendo rehasheada por j -esima ves.

Otro metodo para solucionar este problema es usar permutacion aleatoria delos numeros entre 1 y t ( donde t es igual a tamtabla -1 ), y dejar el j -esimo re-hasheo de h(clave) ser (h(clave) + pj)% tamtabla.

Un tercer metodo para eliminar el (primary clustering) (agrupamiento pri-mario) es el de hacer que la funcion j -esima de rehasheo sea (h(clave) + 2)%tamtabla. Este metodo es llamado rehasheo cuadratico (quadratic rehash)... el cualcabe decir que si bien reduce bastante el riesgo de clustering tiene la desventaja deque en el mejor de los casos solo cubre la mitad de las claves de la tabla y puedepasar de no poderse ingresar elementos nuevos cuando todavıa queda espacio libre.

Mientras que estos metodos eliminan agrupamiento primario no eliminan otrofenomeno llamado agrupamiento secundario (secundary clustering), en el cualdiferentes claves que hashean al mismo valor sigue el mismo camino de rehasheo.

Una forma de eliminar cualquier clase de agrupamiento es usar doble hasheo(double hashing), el cual involucra el uso de dos funciones de hasheo, h1(clave) yh2(clave). h1, la cual es conocida por funcion primaria de hasheo (primary hashfunction), es usada primero usada para determinar la posicion en la cual el registrodebe ser guardado. Si esa posicion esta ocupada, la funcion de rehasheo rh(i,clave)= (i + h2(clave))% tamtabla es usada sucesivamente hasta que se encuentre unelemento de la tabla vacıo. Mientras h2(clave1) no iguale h2(clave2), registros conclaves clave1 y clave2 no competiran por el mismo lugar.

5

1.3 Borrando elementos desde una tabla de hasheo

1.3. Borrando elementos desde una tabla de hasheo

Es muy dificultoso borrar elementos de una tabla de hasheo que usa rehasheopara busquedas e inserciones. Supongamos que el registro r1 esta en la posicionp. Para sumar un registro r2 cuya clave hashea en p, este debe ser insertado en laprimera posicion libre que se encuentra tras volver aplicar la funcion de hasheo enel ındice obtenido, es decir, en la posicion rh(p), rh(rh(p)), etc. Supongamos quer1 es borrado, entonces esa posicion esta ahora vacıa. Ahora si buscamos por r2,vamos a hacer rh(p), donde estaba r1, y la encuentra vacıa por lo tanto piensa quer2 no esta en la tabla.

Una solucion posible a este problema es que marquemos a este registro comoborrado y no como vacıo. Entonces la busqueda solo se detendra si encuentra unregistro vacıo y no uno borrado. Pero esta solucion solo sera viable si nos encon-tramos con pocos registros borrados, ya que si este no fuera el caso, las busquedastocarıan muchas posiciones marcadas como borradas antes de concluir.

1.4. Tablas de hasheo encadenadas

Hasta el momento hemos planteado varias de las desventajas que conllevan lastablas de direccion abierta, muchas de estas desventajas no existen en las tablasde hasheo encadenadas.

Como ya se dijo, el procedimiento consiste en hacer un ındice general que secorresponda con los posibles valores de h(c1), este ındice apunta a listas enlazadas.Luego, no existen colisiones dado que si dos claves hashean en el mismo ındice,simplemente se anade una cadena (chain) a la lista.

Tampoco existe el problema de la eliminacion de claves, dado que solamentebasta con eliminar el nodo correspondiente en la lista.

La desventaja de este metodo con respecto al metodo de open adressing es quesi demasiadas claves hashean en el mismo ındice, las listas crecen considerable-mente, convirtiendo el problema en una busqueda lineal; y el otro inconvenientede este metodo, es que el acceso a un array es mucho mas rapido que el acceso auna lista.

6

1.5 Eficiencia en los metodos de rehasheo

1.5. Eficiencia en los metodos de rehasheo

Utilizando rehasheo, el promedio de comprobaciones depende en la funcion dehasheo y el metodo de rehasheo. Asumamos que todas las funciones de hasheo sonuniformes. Si n es el numero de elementos y tamtabla es el tamano de la tabla.Si tamtabla es grande queda demostrado que en una obtencion exitosa usando re-hasheo lineal es aproximadamente:

2∗tamtabla2∗tamtabla−n+2

Definiendo factor de carga, fc como n/tamtabla. Cuando el factor de carga seaproxima a 1 esta formula es inutil y en cambio debemos usar 2

√(pi ∗ tamtabla/8)+

0, 33.

Para una busqueda no exitosa 0,5 / (1 - fc) 2 + 0,5 para tamanos de tablasgrandes. Cuando la tabla esta llena el numero maximo de comprobaciones a re-alizar es (tamtabla + 1) / 2.

Para tablas pequenas el numero es razonable pero para tablas grandes estepuede mejorarse eliminando el agrupamiento primario seteando rh(i,clave) a rh(i+ hkey)% tamtabla como definimos antes o usando rehasheo cuadratico. Estodeja el numero de comparaciones en aproximadamente 1 - log (1 - fc) - fc/2para busquedas no exitosas. Para tablas completas las busquedas exitosas son en(tamtabla + 1) y las no exitosas se mantienen en orden (tamtabla + 1) / 2.

El doble hasheo mejora la eficiencia eliminando el agrupamiento primario yel secundario. El hasheo uniforme es definido como cualquier esquema de hasheoen el cual cualquier elemento nuevo insertado tiene las mismas posibilidades deser insertado en cualquiera de las posiciones libres de la tabla. Para este esquemateorico, puede ser probado que el tiempo de una busqueda exitosa es aproximada-mente log (1 - fc) / fc; y que una no exitosa requiere (tamtabla + 1) / (tamtabla +1 - n) o aproximadamente 1 / (1 - fc) para tablas grandes. Para tablas completasel tiempo de busqueda exitosas es de log * (tamtabla + 1) - 0,5 y para no exitosas(tamtabla + 1) / 2.

7

1.5 Eficiencia en los metodos de rehasheo

Estos datos indican que el hasheo lineal debe ser evitado para tablas que estana mas del 75% de su capacidad, especialmente si las busquedas son frecuentes,ya que el agrupamiento primario tiene un significativo impacto en los tiemposde busquedas. En cambio el agrupamiento secundario solo adiciona un 0,5 com-probaciones al numero promedio requerido. Dado el hecho de que el doble hasheorequiere calculos adicionales para determinar h2(clave), tal vez sea preferible acep-tar la media comprobaciones extra y usar rh(i,clave) = (i + hclave)% tamtabla.

Otra tecnica que puede mejorar el metodo de rehasheo lineal es rehasheo lin-eal de secuencias divididas. Este metodo se basa en que cuando encontramos queh(clave) esta ocupado, comparamos clave con la clave de kh encontrada en laposicion h(clave). Si kh < h(clave), usamos la funcion de rehasheo i + c1 ; sikh > h(clave), usamos i + c2, como funcion de rehasheo. Esta tecnica reduceel numero de comprobaciones en busquedas exitosas en mas de un 50% y enbusquedas no exitosas en mas de 80%. De cualquier forma las formas de rehasheono lineales son todavıa mejores. Las tablas anteriores tambien demuestran que elgran gasto que conlleva tener tablas casi llenas para una busqueda no exitosa.Las inserciones tambien requieren el mismo numero de comparaciones que lasbusquedas no exitosas. Cuando la tabla esta casi llena las inserciones se aproxi-man a una busqueda secuencial y es peor que una la insercion en un arbol.

8

1.6 Reordenamiento de la tabla de hasheo

Respecto de las tablas resueltas mediante chaining hay que decir que hay undetalle importante para comenzar; en las tablas de direccionamiento, fc es siempremenor a uno, dado que surge de la division del numero de claves por el tamano dela tabla. En el metodo de encadenamiento fc puede ser mayor que uno dado queno existen restricciones al numero de claves a almacenar.

Los tiempos promedios de busqueda en tablas encadenadas son del orden de 1+ fc/2 para busquedas exitosas y fc para busquedas fallidas.

Es evidente que las tablas encadenadas tienen buen rendimiento aun cuando elfactor de carga es grande, cosa que no ocurre en las tablas de hashing de direccionabierta.

Hay que decir algo muy importante acerca de la tecnica de hashing, y esto esque en ningun momento el tiempo de busqueda depende de la cantidad de clavessino que depende exclusivamente del fc; es decir, por mas que en una tabla hayanmillones de entradas, si el tamano de la tabla es suficientemente grande y la funcionde hasheo es la adecuada, el tiempo de busqueda estara siempre acotado y sera elmismo que para una tabla con solo 10 entradas y con un tamano proporcional alanterior. Esto quiere decir que una tabla de hasheo permite realizar de busquedasen un orden O(1) dado que no depende del tamano de la entrada.

1.6. Reordenamiento de la tabla de hasheo

Cuando la tabla esta casi completa, muchos de los elementos de la tabla noestan en los lugares dados por sus claves de hasheo. Deben hacerse muchas com-paraciones antes que de encontrar alguno de los elementos. Si el elemento no estaen la tabla, entonces la totalidad de las posiciones de rehasheo deben ser exam-inadas antes de que esta se determine. Existen varias tecnicas por las cuales sepuede remendar esta situacion.

El primer metodo descubierto por Amble y Knuth, dice que una serie de ele-mentos que hashean en un mismo elemento se mantienen en orden descendientede claves. Cuando buscamos por un elemento no es necesario rehashear repetida-mente hasta obtener un elemento vacıo sino que en cuanto obtenemos un elementocuya clave es menor a la clave de busqueda entonces sabemos que el elemento nose encuentra en la tabla de hasheo. Cuando insertamos un elemento en la tabla, siaccedemos a una clave que es menor a nuestra clave, entonces remplazamos nuestraclave, la clave a insertar, por la menor, que se encuentra en la tabla, y continuamosel proceso de insercion con la clave menor. Una tabla ordenada de esta forma se

9

1.7 Metodo de Brent

llama tabla ordenada de hasheo (ordered hash table).

Usar una tabla ordenada de hasheo no cambia el numero promedio de com-paraciones necesarias para encontrar una clave que esta en una tabla, pero reducesignificativamente el numero de comparaciones para determinar que una clave noexiste en una tabla. Puede demostrarse que el numero total de comparaciones nece-sarias para una busqueda exitosa y una no exitosa es la misma. Desgraciadamenteel promedio de comparaciones requeridas para una insercion no se ve reducidoen una tabla ordenada de hasheo e iguala el numero requerido por una busquedano exitosa en una tabla no ordenada. Las inserciones en una tabla ordenada tam-bien requieren de una significante cantidad de modificaciones en la tabla de hasheo.

1.7. Metodo de Brent

Richard P. Brent descubrio que el tiempo promedio de las busquedas exitosaspodıa ser contenido a medida que una tabla se fuera llenando. La tecnica de Brentesta basada en el echo de que una busqueda exitosa es mucho mas comun que unainsercion, por lo tanto, realizando un poco mas de trabajo en la insercion, ganamostiempo en las busquedas, dado una gran ventaja de rendimiento final. El meto-do requiere rehasheo de los argumentos de busqueda hasta que un espacio vacıoes encontrado. Cada clave en el camino de rehasheo es a su ves rehasheada paradeterminar si ubicar alguna de ellas en un espacio vacıo requerira mas rehasheos.Si este es el caso, los argumentos de busqueda remplazan la siguiente clave en latabla y la clave existente es insertada en su espacio de rehasheo.

1.8. Arboles binarios de hasheo

Otro metodo para mejorar el algoritmo de Brent es atribuido a Gonnet y aMunro y es llamado Arbol Binario de Hasheo.Cada nodo del arbol contiene un ındice en la tabla de hasheo. Entonces el nodoraız del arbol sera nodo(0),nodo(2 * i + 1) y nodo(2 * i + 2) seran su hijo dere-cho e izquierdo respectivamente. Los ındices de la tabla de hasheo contenido ennodo(i) seran referenciados como ındice(i), y su clave en esa posicion como clave(i).

Para explicar como se construye el arbol, primero definamos el ancestro dere-cho mas joven del nodo(i) como adj(i), que es el numero de nodo del padre delmas joven de los ancestros del nodo(i) que es hijo derecho, (En la figura adj(11)es 0). Si un nodo no posee adj entonces su adj es -1 (menos uno).

10

1.8 Arboles binarios de hasheo

El arbol binario es construido en orden numeral. ındice(0) es seteado a h(clave).ındice(i), para cada subsiguiente i, es seteado a rh(ındice((i - 1)/2), clave(adj(i))).Este proceso continua hasta que clave(i) iguala CLAVENULA y una posicion vacıaes encontrada en la tabla.

Una ves que el arbol a sido construido, las claves de los caminos desde la raızhasta los ultimos nodos son reordenados en la tabla de hasheo. emphi es inicializa-do en la posicion del ultimo nodo del arbol. Luego si adj(i) no es cero, clave(adj(i))y su registro asociado es movido desde la tabla[(ındice(adj(i)))] a tabla[ındice(i)]y i es reseteado a adj(i). Este proceso es repetido hasta que adj(i) es -1(menosuno), en cuyo caso clave y registro son insertado en tabla[ındice(i)] y la insercionesta completa.

Cuando buscamos subsecuentemente por claves, dos posiciones de tablas sonprobadas: a y b. Cuando buscamos por la tabla[b].clave, dos comprobaciones masson requeridas. Cuando buscamos por tabla[k].clave una comprobacion es requeri-da. Un total de 5(cinco) posiciones son comprobadas, en toda la tabla de hasheo,cuando insertamos una clave; mientras que 6(seis) son requeridas si hubiera sidoinsertada en su camino de rehasheo.

Vemos que todo el algoritmo depende de la funcion que encuentra el adj(i). Es-ta puede derivar del siguiente metodo para que se realice rapidamente: Encontrarla representacion binaria de i + 1. Borrar cualquier TRAILING de 0(cero) bits y1 bits precediendolos. Restar 1(uno) del resultado del numero binario a obtener suadj(i). Por ejemplo : la representacion de 11(once) + 1(uno) es 1100. removiendo elTRAILING de 100 se llega a 1; entonces adj(11) = 0, adj(17) = 3, adj(14) = 6, etc.

Gonnet y Munro obtienen resultados que se son mas cercanos al optimo que elalgoritmo de Brent. De cualquier forma no son optimos, ya que los elementos de

11

2 El Contenedor Asociativo de Hasheo de la Biblioteca Estandar de Plantillas(STL)

tabla de hasheo solo pueden ser reordenados moviendolos a posiciones mas altasde la tabla y nunca a las posiciones mas bajas. Cuando la tabla esta cargada enfactor 0,9, el arbol binario requiere 1,75 comprobaciones por obtencion (en Brent1.80), con un factor de 0,95 requiere 1.88 (en Brent 1,97). Para una tabla llenarequiere un promedio de 2,13 y Brent 2,5. Mientras que Brent es O( 2

√n) el Arbol

Binario de Hasheo es de O(log n).

2. El Contenedor Asociativo de Hasheo de la

Biblioteca Estandar de Plantillas (STL)

2.1. Tipos nuevos del Contenedor

El contenedor asociativo de hasheo es lo que nos brinda la STL para manejarhashing. Junto con este contenedor aparecen dos tipos de datos mas: X::hasher()que nos da un modelo de funcion de hasheo cuyo argumento es del tipo key type, yX::value type la cual nos da la funcion de comparacion o comprobacion de claves,que tiene un predicado binario cuyo argumento debe ser del tipo X::key type. Conesta ultima un objeto del tipo key equal es devuelto si los argumentos de la funcionson la misma clave, y falso de otra forma. X::key equal debe ser una relacion deequivalencia.

2.2. Notacion

X es un Tipo que es un modelo de Contenedor Asociativo de Hasheo.

a es un Objeto del tipo X.

t es un Objeto del tipo X::value type.

k es un Objeto del tipo X::key type.

p,q son Objetos del tipo X::iterator.

n es un Objeto del tipo X::size type.

h es un Objeto del tipo X::hasher.

c es un Objeto del tipo X::key equal

12

2.3 Definiciones

2.3. Definiciones

Los elementos del Contenedor Asociativo de Hasheo son organizados en bucket(buckets). El contenedor utiliza el valor de la funcion de Hasheo para determinara cual bucket se le asignara.

2.4. Funciones del Contenedor :

2.5. Garantıas de complejidad

El contenedor nos brinda ciertas garantıas de complejidad para las operacionesde sus funciones, las cuales son :

Todos los constructores son amortizados en un tiempo constante.

Las funciones de comprobacion y de hasheo estan amortizadas en tiempo con-stante.

13

2.6 Modelos en el contenedor :

La complejidad promedio para eliminar una clave es de O(count(clave)). En elpeor caso es lineal con el tamano del contenedor.

Borrar elementos esta amortizado en tiempo constante.

El promedio de complejidad para borrar un rango es de O(n), donde n es lalongitud del rango.

El promedio de complejidad para la busqueda es de tiempo constante. En elpeor por caso es lineal con el tamano del contenedor.

El promedio de complejidad para la comparacion de rangos es de O(count(clave)).El peor caso es lineal con el tamano del Contenedor.

El conteo de bucket esta amortizado en tiempo constante.

Cambiar el tamano del Contenedor es lineal con el tamano del contenedor.

2.6. Modelos en el contenedor :

hash set: Guarda claves del tipo Key. Pertenece tambien al Contenedor Aso-ciativo Unico; no permite que dos claves comparen igual.

hash map: Asocia objetos del tipo Key con objetos del tipo Data. Pertenecetambien al Contenedor de Pares Asociados lo que significa que su tipo de valor espair¡const Key, Data¿.Tambien es un Contenedor Asociativo Unico.

hash multiset: Es un Contenedor Asociativo Multiple que permite dos o masclaves comparen de la misma forma.

hash multimap: Posee las mismas funciones que el hash map pero es un Con-tenedor Asociativo Multiple.

3. Bibliografıa

Andrew S. Tanenbaum - ”Structured Computer Organization, 4th ed.”http://www.cs.vu.nl/ ast/

14

3 Bibliografıa

Donal Ervin Knuth - ”The Art Of Computer Programming” - Volume 3 - Sort-ing and Searching - Second Edition - 1998.

Silicon Graphics Computer Systems, Inc. - Standard Template Library Pro-grammer’s Guide -http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi/srch24@standar%20template%20library/0650/bks/SGI Developer/books/STL PG/sgi html/index.html

Kruse - ”Data Structures And Program Design”- 1st Edition - Prentice-Hall,Inc. - 1984.

Kruse - ”Data Structures And Program Design In C++” - 1st Edition - Prentice-Hall, Inc. - 2000

Menezes, van Oorschot, Vanstone - ”Handbook Of Applied Cryptography” -CRC Press - 1997.http://www.cacr.math.uwaterloo.ca/hac

Sedgewick; ”Algorithms” - Addison-Wesley - 1983.

15