Top 10 de los artículos

YouTube
Gmail
Goole
GayRomeo
Números chinos
Números romanos
Orkut
Costco
Sistema porta hepático
El mundo Factbook

News:

Tabla de hash

En informática, a tabla de hash, o a mapa del picadillo, es a estructura de datos ese asociados llaves con valores. La operación primaria que apoya es eficientemente a operaciones de búsqueda: dado una llave (e.g. el nombre de una persona), encuentra el valor correspondiente (e.g. número de teléfono de esa persona). Trabaja transformando la llave usando a función del picadillo en a picadillo, un número que se utiliza como un índice en un arsenal para localizar la localización deseada (“cubo”) donde los valores deben estar.

Las tablas de hash apoyan la inserción eficiente de nuevas entradas, en esperado O (1) tiempo. El tiempo pasado en buscar depende de la función del picadillo y de la carga de la tabla de hash; inserción y acercamiento de la búsqueda O (1) el tiempo con valores bien elegidos y hashes.

Contenido

Operación básica

Una tabla de hash trabaja transformando la llave usando a función del picadillo en a picadillo, un número que se utiliza como un índice en un arsenal para localizar la localización deseada (“cubo”) donde los valores deben estar. El número es convertido normalmente en el índice tomando a modulo, o a veces el enmascarar mordido se utiliza donde está una energía el tamaño del arsenal de dos. La función óptima del picadillo para cualquier uso dado de una tabla de hash puede variar extensamente, sin embargo, dependiendo de la naturaleza de la llave.

Las operaciones típicas en una tabla de hash incluyen la inserción, la canceladura y operaciones de búsqueda (aunque algunas tablas de hash son calculadas de antemano de modo que ningunas inserciones o canceladuras, sólo las operaciones de búsqueda se hacen en un sistema vivo). Estas operaciones todas se realizan en el tiempo constante amortizado, que hace mantener y tener acceso a una tabla de hash enorme muy eficiente.

Resolución de la colisión

Si dos llaves hash al mismo índice, los expedientes correspondientes no se pueden almacenar en la misma localización. Así pues, si se ocupa ya, debemos encontrar otra localización para almacenar el nuevo expediente, y lo hacemos de modo que poder encontrarlo cuando lo miramos para arriba después.

Para dar una idea de la importancia de una buena estrategia de la resolución de la colisión, considere el resultado siguiente, el usar derivado paradoja del cumpleaños. Aunque asumimos que nuestra función del picadillo hace salir índices al azar distribuido uniformemente sobre el arsenal, e iguale para una tabla de hash con 1 millón de índices, hay una ocasión del 95% por lo menos de una colisión que ocurre antes de que contenga 2500 expedientes.

Hay un número de técnicas de la resolución de la colisión, pero el más populares son dirección abierta y encadenamiento.


Encadenamiento separado

Llamado a veces simplemente encadenamiento o encadenamiento directo, esta técnica en su forma más simple tiene a lista encadenada de expedientes insertados en cada ranura en las referencias del arsenal. Cada lista encadenada tiene cada elemento que choque a la misma ranura. La inserción requiere encontrar la ranura correcta, y la adición a cualquier extremo de la lista en esa ranura; la canceladura requiere buscar la lista y el retiro.

Las tablas de hash encadenadas tienen tablas de hash tratadas abiertas del excedente de las ventajas en que la operación del retiro es simple y volver a clasificar según el tamaño la tabla se puede posponer por un tiempo mucho más largo porque funcionamiento degrada más agraciado aun cuando cada ranura se utiliza. De hecho, muchas tablas de hash de encadenamiento pueden no requerir volver a clasificar según el tamaño en todos puesto que la degradación del funcionamiento es linear pues la tabla llena. Por ejemplo, una tabla de hash de encadenamiento que contiene dos veces su capacidad recomendada de datos sería solamente alrededor dos veces tan lenta en promedio como la misma tabla en su capacidad recomendada.

Las tablas de hash encadenadas heredan las desventajas de listas encadenadas. Al almacenar expedientes pequeños, los gastos indirectos de la lista encadenada pueden ser significativos. Una desventaja adicional es ésa que atraviesa una lista encadenada tiene pobres funcionamiento del escondrijo.

Las estructuras de datos alternativas se pueden utilizar para las cadenas en vez de listas encadenadas. Usando a árbol uno mismo-que balancea, por ejemplo, la época a lo peor teórica de una tabla de hash se puede traer abajo a O (registro n) más bien que O (n). Sin embargo, puesto que cada lista se piensa para ser corta, este acercamiento es generalmente ineficaz a menos que la tabla de hash se diseñe para funcionar en la capacidad completa o hay tarifas inusualmente altas de la colisión, como fuerza ocurre en la entrada diseñada para causar colisiones. Órdenes dinámicos la poder también se utilice para disminuir gastos indirectos del espacio y para mejorar funcionamiento del escondrijo cuando los expedientes son pequeños.

Algunas puestas en práctica de encadenamiento utilizan una optimización donde el primer expediente de cada cadena se almacena en la tabla. [1] El propósito es aumentar la eficacia del escondrijo del acceso de la tabla de hash. Para evitar de perder cantidades de espacio grandes, tales tablas de hash mantendrían a coeficiente de carga de 1.0 o mayor. El término encadenamiento directo se utiliza a veces describir puestas en práctica eso no utilice esta optimización.

Dirección abierta

Artículo principal: Dirección abierta

Las tablas de hash de dirección abiertas almacenan los expedientes directamente dentro del arsenal. Este acercamiento también se llama hashing cerrado. Una colisión del picadillo se resuelve cerca el sondar, o buscando con localizaciones alternas en el arsenal ( secuencia de la punta de prueba) hasta o el expediente de la blanco se encuentra, o se encuentra una ranura inusitada del arsenal, que indica que no hay tal llave en la tabla. [2] Las secuencias bien conocidas de la punta de prueba incluyen:

el sondar linear 
en cuáles es fijo el intervalo entre las puntas de prueba - a menudo en 1.
el sondar cuadrático 
en cuál el intervalo entre los aumentos de las puntas de prueba proporcionales al valor del picadillo (el intervalo que aumenta así linear y los índices son descritos por una función cuadrática).
hashing doble 
en cuál es computado el intervalo entre las puntas de prueba por otra función del picadillo.

Dirección abierta contra el encadenamiento

Las tablas de hash encadenadas tienen la dirección abierta del excedente siguiente de las ventajas:

  • Son simples poner en ejecución con eficacia y requerir solamente las estructuras de datos básicas.
  • Desde el punto de vista de las funciones convenientes del picadillo de la escritura, las tablas de hash encadenadas son insensibles a arracimar, requiriendo solamente la minimización de colisiones. La dirección abierta depende de funciones mejores del picadillo para evitar de arracimar. Esto es particularmente importante si los programadores del principiante pueden agregar sus propias funciones del picadillo, pero incluso los programadores experimentados se pueden coger hacia fuera por efectos que arraciman inesperados.
  • Degradan en funcionamiento más agraciado. Aunque las cadenas crecen más de largo mientras que la tabla llena, una tabla de hash encadenada no puede “llenar para arriba” y no exhibe los aumentos repentinos en los tiempos de las operaciones de búsqueda que ocurren en una tabla cercano-llena con la dirección abierta. (vea a la derecha)
  • Si la tabla de hash almacena grande registra, cerca de 5 o más palabras por el expediente, encadenando aplicaciones menos memoria que la dirección abierta.
  • Si la tabla de hash es escasa (es decir, tiene un arsenal grande con muchas ranuras libres del arsenal), el encadenamiento utiliza menos memoria que la dirección abierta incluso para los expedientes pequeños de 2 a 4 palabras por el expediente debido a su almacenaje externo.

Para los tamaños del registro pequeños (algunas palabras o menos) las ventajas de la dirección abierta sobre el terreno comparada al encadenamiento están:

  • Pueden ser espacio-más eficientes que encadenando puesto que no necesitan almacenar ninguna indicadores o asignar ningún espacio adicional fuera de la tabla de hash. Las listas encadenadas simples requieren una palabra de los gastos indirectos por el elemento.
  • Las inserciones evitan los gastos indirectos del tiempo de la asignación de memoria, y se pueden incluso poner en ejecución en ausencia de un allocator de la memoria.
  • Porque utiliza almacenaje interno, la dirección abierta evita el engaño adicional requerido para encadenar almacenaje externo. También tiene mejor lugar de la referencia, particularmente con sondar linear. Con tamaños del registro pequeños, estos factores pueden rendir un funcionamiento mejor que encadenando, particularmente para las operaciones de búsqueda.
  • Pueden ser más fáciles a serialice, porque no utilizan indicadores.

Por otra parte, la dirección abierta normal es una opción pobre para los elementos grandes, puesto que estos elementos llenan entero líneas del escondrijo (negando la ventaja del escondrijo), y una cantidad de espacio grande se pierde en ranuras vacías grandes de la tabla. Si la tabla de dirección abierta almacena solamente referencias a los elementos (almacenaje externo), utiliza el espacio comparable al encadenamiento incluso para los expedientes grandes pero pierde su ventaja de la velocidad.

Generalmente hablando, la dirección abierta se utiliza mejor para las tablas de hash con los expedientes pequeños que se pueden almacenar dentro de la tabla (almacenaje interno) y del ajuste en una línea del escondrijo. Son particularmente convenientes para los elementos de una palabra o menos. En caso de que se espere que las tablas tengan altos coeficientes de carga, los expedientes son grandes, o variable-se clasifican los datos, las tablas de hash encadenadas se realizan a menudo también o mejoran.

En última instancia, utilizado sensible, cualquier clase de algoritmo de la tabla de hash es generalmente rápida bastantes; y el porcentaje de un cálculo pasado en código de la tabla de hash es bajo. El uso de la memoria raramente se considera excesivo. Por lo tanto, en la mayoría de los casos las diferencias entre estos algoritmos son marginales, y otras consideraciones entran en típicamente el juego.

Hashing unido

Artículo principal: Hashing unido

Un híbrido del encadenamiento y abre tratando, las cadenas unidas de nodos dentro de la tabla sí mismo de los acoplamientos del hashing junto. [2] Como la dirección abierta, alcanza ventajas del uso y (disminuido algo) del escondrijo del espacio sobre el encadenamiento. Como el encadenamiento, no exhibe efectos que arraciman; de hecho, la tabla se puede llenar eficientemente a una alta densidad. Desemejante del encadenamiento, no puede tener más elementos que ranuras de la tabla.

Hashing perfecto

Artículo principal: Función perfecta del picadillo

Si todas las llaves que serán utilizadas no se saben delante de tiempo, y allí no son no más de llave que puede caber la tabla de hash, hashing perfecto puede ser utilizado crear una tabla de hash perfecta, en la cual no habrá colisiones. Si hashing perfecto mínimo se utiliza, cada localización en la tabla de hash puede ser utilizado también.

El hashing perfecto da una tabla de hash donde está constante la época de hacer operaciones de búsqueda en el a lo peor. Esto está en contraste con el encadenamiento y abre la dirección de métodos, donde está baja la época para las operaciones de búsqueda en promedio, pero puede ser arbitrariamente grande. Existen los métodos para mantener una función perfecta del picadillo bajo inserciones de llaves, conocidas como hashing perfecto dinámico. Un alternativa más simple, de que también da tiempo constante a lo peor de las operaciones de búsqueda, es hashing del cuco.

Hashing Probabilistic

Quizás la solución más simple a una colisión es substituir el valor que está ya en la ranura con el nuevo valor, o levemente menos comúnmente, caen el expediente que debe ser insertado. En búsquedas más últimas, esto puede dar lugar a una búsqueda que no encuentra un expediente se ha insertado que. Esta técnica es particularmente útil para poner depositar en ejecución.

Una solución aún más espacio-eficiente que es similar a esto es el uso a arsenal de pedacito (un arsenal de campos del uno-pedacito) para nuestra tabla. Todos los pedacitos se fijan inicialmente a cero, y cuando insertamos una llave, fijamos el pedacito correspondiente a uno. Las negativas falsas no pueden ocurrir, pero positivos falsos poder, desde entonces si la búsqueda encuentra un 1 pedacito, demandará que el valor fue encontrado, aunque él era justo otro valor que hashed en la misma ranura del arsenal por coincidencia. En realidad, tal tabla de hash es simplemente un tipo específico de Filtro de la floración.

Hashing de Robin Hood

Una variación interesante en la resolución de la colisión del doble-hashing es la del hashing de Robin Hood. La idea es que una llave insertada ya se puede desplazar por una nueva llave si su cuenta de la punta de prueba es más grande que la llave en la posición actual. El efecto neto de esto es que reduce tiempos a lo peor de la búsqueda en la tabla. Esto es similar a las tablas de hash pedidas de Knuth a menos que los criterios para topar una llave no dependan de una relación directa entre las llaves.[3]

El volver a clasificar según el tamaño de la tabla

Con una buena función del picadillo, una tabla de hash puede contener típicamente cerca de 70%-80% tantos elementos mientras que tabula ranuras y todavía se realiza bien. Dependiendo del mecanismo de la resolución de la colisión, el funcionamiento puede comenzar a sufrir o gradualmente o como más elementos se agregan dramáticamente. Para tratar de esto, cuando el coeficiente de carga excede un cierto umbral, es necesario asignar una tabla nueva, más grande, y agrega todo el contenido de la tabla original a esta tabla nueva. En Javala 'clase de s HashMap, por ejemplo, el umbral del coeficiente de carga del defecto es 0.75.

Esto puede ser una operación muy costosa, y la necesidad para ella es una de las desventajas de la tabla de hash. De hecho, algunos métodos ingenuos para hacer esto, tal como agrandamiento de la tabla por una cada vez que usted agrega un nuevo elemento, reducen funcionamiento tan drástico en cuanto a hacen la tabla de hash inútil. Sin embargo, si la tabla es agrandada por un ciertos por ciento fijos, tales como 10% o 100%, puede ser demostrado usar análisis amortizado que estos resizings son tan infrecuentes que el tiempo medio por la inserción sigue siendo constante-tiempo. Para ver porqué esto es verdad, suponga que una tabla de hash que usa el encadenamiento comienza en el tamaño mínimo de 1 y que está doblada cada vez que llena sobre 100%. Si en el extremo contiene n los elementos, entonces el total agregan las operaciones realizadas para todos los resizings son:

1 + 2 + 4 + 8 +… + n = 2n - 1.

Porque los costes de los resizings forman a serie geométrica, el coste total es O (n). Pero es necesario también realizarse n operaciones para agregar n elementos en el primer lugar, así que la época total de agregar n los elementos con volver a clasificar según el tamaño son O (n), un rato amortizado de O (1) por el elemento.

Por otra parte, algunas puestas en práctica de la tabla de hash, notablemente adentro sistemas en tiempo real, no puede pagar el precio de agrandar la tabla de hash de una vez, porque puede interrumpir operaciones tiempo-críticas. Un acercamiento simple es asignar la tabla con bastante espacio para el número previsto de elementos y prohibir inicialmente la adición de demasiados elementos. Otra técnica útil pero memoria-más intensiva es realizar volver a clasificar según el tamaño gradualmente:

  • Asigne la tabla de hash nueva, pero deje la vieja tabla de hash y compruebe ambas tablas durante operaciones de búsqueda.
  • Cada vez que se realiza una inserción, agregue que elemento a la tabla nueva y también muévase k elementos de la vieja tabla a la tabla nueva.
  • Cuando todos los elementos se quitan de la vieja tabla, desasígnela.

Para asegurarse de que la vieja tabla sea copiada totalmente encima antes de que la tabla nueva sí mismo necesite ser agrandada, es necesario aumentar el tamaño de la tabla en un factor de por lo menos (k + 1)/k durante volver a clasificar según el tamaño.

Hashing linear [4] es un algoritmo de la tabla de hash que permite la extensión incremental de la tabla de hash. Se pone en ejecución usando una sola tabla de hash, pero con dos funciones posibles de las operaciones de búsqueda.

Otra manera de disminuir el coste de la tabla que vuelve a clasificar según el tamaño es elegir una función del picadillo de una manera tal que hashes de la mayoría de los valores no cambien cuando se vuelve a clasificar según el tamaño la tabla. Este acercamiento, llamado hashing constante, es frecuente en disk-based y distribuido hashes, donde está prohibitivo costoso el volver a clasificar según el tamaño.

Complejidad de Tiempo y aplicaciones comunes de tablas de hash

Las tablas de hash son de uso frecuente poner en ejecución órdenes sociables, sistemas y escondrijos. Como órdenes, las tablas de hash proporcionan 1) operación de búsqueda del constante-tiempo O (en promedio, sin importar el número de artículos en la tabla. Mientras que teóricamente el tiempo a lo peor de las operaciones de búsqueda puede ser tan malo como O (n), esto es, para los propósitos prácticos, estadístico inverosímil a menos que la función del picadillo se diseñe mal o a menos que el sistema de llaves se elige malévolo con la función dada del picadillo en mente. Éstos casos de la esquina se tratan en análisis matemático con Asunción uniforme simple del Hashing, que pone condiciones asumidas básicas en la función del picadillo.

Comparado a otras estructuras de datos sociables del arsenal, las tablas de hash son las más útiles cuando una gran cantidad de expedientes deben ser almacenados, especialmente si el tamaño del modem puede ser predicho.

Las tablas de hash se pueden utilizar como estructuras de datos de la en-memoria. Las tablas de hash se pueden también adoptar para el uso con estructuras de datos persistentes; los índices de la base de datos utilizan a veces las estructuras de datos disk-based basadas en tablas de hash, aunque árboles equilibrados sea más popular.

Elegir una buena función del picadillo

Artículo principal: Función del picadillo

Una buena función del picadillo es esencial para el buen funcionamiento de la tabla de hash. Una opción pobre de una función del picadillo es probable conducir a el arracimar, en que probabilidad de las llaves traz al mismo cubo del picadillo (es decir. a colisión) es perceptiblemente mayor que esperaría de una función al azar. Una probabilidad distinta a cero de la colisión es inevitable en cualquier puesta en práctica del picadillo, pero generalmente el número de las operaciones requeridas para resolver escalas de una colisión linear con el número de las llaves traz al mismo cubo, así que exceso de las colisiones degradarán funcionamiento perceptiblemente. Además, algunas funciones del picadillo son de cómputo costosas, así que la cantidad de tiempo (y, en algunos casos, de memoria) tomada para computar el picadillo puede ser pesada.

Elegir una buena función del picadillo es difícil. La literatura es repleta con opciones pobres, por lo menos cuando es medida por estándares modernos. Por ejemplo, el picadillo multiplicative muy popular abogado cerca Donald Knuth en El arte de la programación de la computadora (véase la referencia abajo) tiene particularmente comportamiento que arracima pobre. [1] Sin embargo, puesto que el hashing pobre degrada simplemente el funcionamiento de la tabla de hash para las distribuciones particulares de la llave de la entrada, tales problemas van comúnmente desapercibidos.

La literatura es semejantemente escasa en los criterios para elegir una función del picadillo. Desemejante de la mayoría de las otras estructuras fundamentales de los algoritmos y de datos, no hay consenso universal en qué hace una “buena” función del picadillo. El resto de esta sección es organizado por tres criterios: simplicidad, velocidad, y fuerza. Además, examina los algoritmos sabidos para realizarse bien por estos criterios.

La simplicidad y la velocidad se miden fácilmente objetivo (por el número de líneas del código y de las pruebas patrones de la CPU, por ejemplo), pero la fuerza es un concepto más deslizadizo. Obviamente, a función criptográfica del picadillo por ejemplo SHA-1 satisfaría los requisitos relativamente flojos de la fuerza necesitados para las tablas de hash, pero su lentitud y complejidad las hace desagradables. Sin embargo, usar funciones criptográficas del picadillo puede proteger contra ataques de la colisión cuando el módulo de la tabla de hash y sus factores no se pueden mantener secretos del atacante,[citación necesitada] o alternativomente, aplicando un secreto sal. Sin embargo, para estos casos especializados, a función universal del picadillo puede ser utilizado en vez de un picadillo estático.

En ausencia de una medida estándar para la fuerza de la función del picadillo, el estado plus ultra actual es emplear una batería de estadístico pruebas a la medida si la función del picadillo puede ser fácilmente distinguida de una función al azar. La prueba más importante es discutible determinarse si la función del picadillo exhibe efecto de la avalancha, que esencialmente indica que cualquier cambio de un solo bit en la llave de la entrada debe afectar, en el promedio, mitad de los pedacitos en la salida. Prueba de los abogados de Bret Mulvey condición terminante de la avalancha particularmente, que indica que, para cualquier cambio de un solo bit, cada uno de los pedacitos de la salida debe cambiar con la probabilidad una mitad, independiente de los otros pedacitos en la llave. Funciones puramente aditivas del picadillo por ejemplo CRC falle esta condición más fuerte desgraciadamente.

Claramente, una función fuerte del picadillo debe tener a distribución uniforme de los valores del picadillo. Bret Mulvey propone el uso de a prueba chi-ajustada para la uniformidad, basado encendido energía de dos tamaños de la tabla de hash que se extienden a partir del 21 a 216. Esta prueba es considerablemente más sensible que muchos otras propuesta para las funciones del picadillo que miden, y encuentra problemas en muchas funciones populares del picadillo.

Afortunadamente, hay las buenas funciones del picadillo que satisfacen todos estos criterios. La clase más simple toda consume un octeto de la llave de la entrada por la iteración del lazo interno. Dentro de esta clase, la simplicidad y la velocidad se relacionan de cerca, pues los algoritmos rápidos no tienen simplemente tiempo para realizar cálculos complejos.

Una puesta en práctica matemática del octeto-por-octeto que se realiza particularmente bien es el picadillo del Uno-en-uno-tiempo de Jenkins, adaptado aquí de un artículo de Bob Jenkins, su creador.

jenkins_one_at_a_time_hash de uint32_t(sin firmar carbón el *key, size_t key_len)
{
picadillo de uint32_t = 0;
size_t i;

para (i = 0; i  < key_len; i++) {
llave del picadillo +=[i];
picadillo += (picadillo  << 10);
^= del picadillo (picadillo  >> 6);
}
picadillo += (picadillo  << 3);
^= del picadillo (picadillo  >> 11);
picadillo += (picadillo  << 15);
vuelta picadillo;
}

El comportamiento de la avalancha de este picadillo se demuestra a la derecha. La imagen fue hecha usando AvalancheTest de Bret Mulvey en el suyo Toolset de Hash.cs.

Cada uno de las 24 filas corresponde a un de un solo bit en la llave de la entrada de 3 octetos, y cada uno de las 32 columnas corresponde a un pedacito en el picadillo de la salida. Los colores son elegidos por como de bien el pedacito de la llave de la entrada afecta dado el picadillo de la salida mordido: un cuadrado verde indica bueno mezclando el comportamiento, un comportamiento que se mezcla débil cuadrado amarillo, y el rojo no indicaría ningún mezclarse. Solamente algunos pedacitos en el octeto pasado de la llave de la entrada se mezclan débil a una minoría de los pedacitos en el picadillo de la salida, un funcionamiento sumamente mejor que un número de funciones ampliamente utilizadas del picadillo.

Muchas funciones de uso general del picadillo se realizan mal cuando están sujetadas a tal prueba rigurosa de la avalancha. Favorecido extensamente FNV hash, por ejemplo, las demostraciones muchos pedacitos sin mezclarse en todos, especialmente para las llaves cortas. Vea evaluación de FNV por Bret Mulvey para un análisis más cuidadoso.

Si la velocidad es más importante que simplicidad, entonces la clase de las funciones del picadillo que consumen pedazos del multibyte por la iteración puede estar de interés. Uno del más sofisticada es “lookup3” por Bob Jenkins, que consume la entrada en 12 pedazos del octeto (pedacito 96). Nota, aunque, que cualquier mejora de la velocidad del uso de este picadillo es solamente probable ser útil para las llaves grandes, y que la complejidad creciente puede también tener consecuencias de la velocidad tales como evitar que un recopilador óptimo inlining la función del picadillo. Bret Mulvey analizaba versión anterior lookup2, y encontrado le para tener comportamiento excelente de la avalancha.

Una característica deseable de una función del picadillo es que la conversión del valor del picadillo (típicamente 32 pedacitos) a un índice del cubo para una tabla de hash del particular-tamaño puede ser hecha simplemente enmascarando, preservando solamente los pedacitos más bajos de k para una tabla del tamaño 2k (una operación equivalente a computar el valor del picadillo modulo el tamaño de la tabla). Esta característica permite la técnica de doblar incremental del tamaño de la tabla de hash - cada cubo en los viejos mapas de la tabla a solamente dos en la tabla nueva. Debido a su uso de XOR-doblar, el picadillo de FNV no tiene esta característica. Algún más viejo hashes es incluso peor, requiriendo tamaños de la tabla ser un número primero más bien que una energía de dos, computando otra vez el índice del cubo como el modulo del valor del picadillo el tamaño de la tabla. Tal requisito es generalmente una muestra de una función fundamental débil; usar un tamaño primero de la tabla es un substituto pobre para usar una función más fuerte.

Edición pedida de la recuperación

Los datos del almacén de las tablas de hash en localizaciones pseudo-random, así que tener acceso a los datos de una manera clasificada son una operación muy desperdiciadora de tiempo. Otras estructuras de datos por ejemplo árboles de busqueda binaria uno mismo-que balancean funcione generalmente más lentamente (puesto que su tiempo de las operaciones de búsqueda es O (registro n)) y sea algo más complejo poner en ejecución que tablas de hash sino mantener una estructura de datos clasificada siempre. Vea una comparación de tablas de hash y de árboles de busqueda binaria uno mismo-que balancean.

Problemas con las tablas de hash

Aunque las operaciones de búsqueda de la tabla de hash utilizan tiempo constante en promedio, el tiempo pasado puede ser significativo. La evaluación de una buena función del picadillo puede ser una operación lenta. Particularmente, si la indexación de direcciones simple del arsenal se puede utilizar en lugar de otro, esto es generalmente más rápido.

Las tablas de hash en general exhiben a pobres lugar de la referenciaque es, los datos que se alcanzarán se distribuyen aparentemente al azar en memoria. Porque las tablas de hash causan los patrones del acceso que saltan alrededor, éste puede accionar escondrijo del microprocesador falta que la causa larga retrasa. Estructuras de datos compactas tales como órdenes, buscados con búsqueda linear, puede ser más rápido si la tabla es relativamente pequeña y las llaves son baratas comparar, por ejemplo con llaves simples del número entero. Según Ley de Moore, los tamaños del escondrijo están creciendo exponencial y qué se considera “pequeño” puede aumentar tan. El punto óptimo del funcionamiento varía de sistema al sistema.

Más perceptiblemente, las tablas de hash son más difíciles y error-prone escribir y utilizar. Las tablas de hash requieren el diseño de una función eficaz del picadillo para cada tipo dominante, que en algunas situaciones es más difícil y desperdiciador de tiempo diseñar y eliminar errores que la función simple de la comparación requerida para a árbol de busqueda binaria uno mismo-que balancea. En tablas de hash abrir-tratadas es bastante fácil crear una función pobre del picadillo.

Además, en algunos usos, a sombrero negro con el conocimiento del picadillo la función puede poder proveer la información a un picadillo que cree comportamiento a lo peor causando colisiones excesivas, dando por resultado la degradación de las prestaciones muy (es decir, a negación del ataque del servicio). En usos críticos, cualquiera hashing universal puede ser utilizado o una estructura de datos con garantías a lo peor mejores puede ser preferible. Para los detalles, vea Crosby y Wallach Negación del servicio vía ataques algorítmicos de la complejidad.

Puestas en práctica

Mientras que muchos lenguajes de programación proporcionan ya funcionalidad de la tabla de hash (véase ayuda de la lengua para los órdenes sociables), hay varias puestas en práctica independientes digno de mencionar.

  • Picadillo escaso de Google El proyecto de Google SparseHash contiene varias puestas en práctica del picadillo-mapa funcionando en Google, con diversas características de funcionamiento, incluyendo una puesta en práctica que optimice para el espacio y una que optimice para la velocidad. Memoria-optimizado es extremadamente memoria-eficiente con solamente 2 pedacitos/entrada de gastos indirectos.
  • SunriseDD Una biblioteca abierta de la fuente C para el almacenaje de la tabla de hash de datos arbitrarios se opone con operaciones de búsqueda cerradura-libres, la cuenta incorporada de la referencia y la iteración garantizada de la orden. La biblioteca puede participar en la referencia externa que cuenta sistemas o utilizar su propia cuenta incorporada de la referencia. Viene con una variedad de funciones del picadillo y permite el uso de las funciones proveídas tiempo de pasada del picadillo vía mecanismo del servicio repetido. El código de fuente está bien documentado.
  • uthash Esto es una tabla de hash fácil de utilizar para las estructuras de C.
  • Un número de tiempos de pasada de la lengua y/o de bibliotecas estándares utilizan tablas de hash para poner su ayuda en ejecución para los órdenes sociables.
  • El software escrito para reducir al mínimo uso de la memoria puede conservar memoria manteniendo todas las secuencias asignadas una tabla de hash. Si se encuentra una secuencia ya existente un indicador a esa secuencia se vuelve; si no, una secuencia nueva se asigna y se agrega a la tabla de hash. (Ésta es la técnica normal usada en el lisp para los nombres de variables y de funciones; vea la documentación para el interno y las funciones internar-suaves si usted está utilizando que la lengua.) la compresión de datos alcanzada de este modo es generalmente el alrededor 40%.[la citación necesitó]

Vea también

Referencias

  1. ^ Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2001). Introducción a los algoritmos, segunda edición, prensa y McGraw-Colina, pp del MIT. 222. ISBN 978-0-262-53196-2. 
  2. ^ a b Tenenbaum, Aaron M.; Langsam, Yedidyah y Augenstein, Moshe J. (1990), Estructuras de datos usando C, Prentice Pasillo, pp. pp. 456-461, pp. 472, ISBN 0-13-199746-7 
  3. ^ Celis, Pedro (1986). Hashing de Robin Hood. Departamento técnico de la informática del informe, universidad de Waterloo CS-86-14.
  4. ^ Litwin, Witold (el an o 80). “Hashing linear: Una herramienta nueva para el archivo y tabla que trata ". Proc. 6to Conferencia sobre bases de datos muy grandes: 212-223. 

Lectura adicional

Acoplamientos externos

The original article is from Wikipedia. To view the original article please click here.
Creative Commons Licence