¿Cómo podemos lograr la inserción en el hash en el peor de los casos en O (1) mediante el uso de la matriz, mientras que las matrices tienen problemas de extensión en filledup?

Su razonamiento es: si no podemos garantizar la inserción de tiempo constante en una matriz simple, ¿cómo podríamos hacer eso en una tabla hash más complicada? El razonamiento es sólido, pero la premisa no lo es.

Es posible implementar una matriz con inserción de tiempo constante. Aquí hay una idea simple: comience con una matriz de un tamaño determinado. Cuando se llene, asigne otra matriz de doble tamaño, pero (todavía) no copie la matriz anterior. Copie un elemento a la vez desde la matriz anterior a la nueva, cada vez que se inserte un nuevo elemento.

Aquí hay un ejemplo. Empezar con
[1 2 3]

Insertar 4. La matriz está llena, asigne una matriz del doble del tamaño. Agregue 4 a la cuarta posición y copie el tercer elemento.
[1 2 3]
[? ? 3 4? ?]
También llevamos un registro de los límites, es decir, aún necesitamos copiar 2 elementos.

Insertar 5. Tenemos espacio, así que lo colocamos en la quinta posición, y también volvemos y copiamos 2:
[1 2 3]
[? 2 3 4 5?]
Todavía necesitamos copiar 1 elemento.

Insertar 6:
[1 2 3]
[1 2 3 4 5 6]
Hemos terminado de copiar los elementos antiguos, en este punto podemos tirar la primera matriz. Tenga en cuenta que siempre terminamos cuando tenemos que expandirnos nuevamente (gracias a la duplicación). Siempre que necesitemos buscar un elemento, sabemos en qué matriz debemos buscar (porque siempre sabemos cuántos elementos aún necesitamos copiar).

Esta es una idea común para eliminar la amortización: haga el trabajo que necesitamos hacer un bit a la vez con cada operación. Este tipo de técnica se puede aplicar al extender tablas hash; usarlo con una tabla hash simple con cadenas de listas vinculadas puede admitir la inserción de O (1) en el peor de los casos. La advertencia es que puede estar insertando el mismo elemento varias veces y solo averiguarlo durante la búsqueda, lo que, por supuesto, se amortizaría O (1). No creo que se conozca ninguna técnica de hashing que garantice la inserción Y búsqueda de O (1) en el peor de los casos. Es posible garantizar la búsqueda de O (1) en el peor de los casos con la inserción amortiguada de O (1) (ver hash de cuco).

Una nota final: dependiendo del sistema en el que esté trabajando, podría tener la libertad de extender siempre el área de memoria que está utilizando. Por ejemplo, puede reservar una gran cantidad de espacio de direcciones virtuales y solo asignar y “asignar” páginas según sea necesario. En dicho sistema, extender una matriz en tiempo constante es simple, y la pregunta de si puede tener una inserción de tiempo constante en el peor de los casos en una tabla hash es interesante.

La respuesta es que no. Este es el problema con las tablas hash y cualquier algoritmo posible para crear. Leer. Actualizar o Eliminar. Entonces, tienes algunas opciones.

1) después de un conflicto de hash, puede buscar el siguiente hoyo. Esto lleva a problemas para garantizar que encuentre un valor, ya que si la clave no es lo que comió buscando en el hash, debe escanear toda la matriz para que no se pierda nada. Si la tabla hash se llena, debe asignar una nueva tabla y volver a hacer hash en cada entrada.

2) tener cubos en lugar de entradas individuales en cada lugar de la tabla hash. El acceso a un depósito se puede realizar de varias maneras, pero generalmente es una matriz o un árbol binario equilibrado. (Ahora tiene un árbol binario equilibrado además de la tabla hash. ¿Exactamente qué está guardando?). Esto tiene la ventaja de no volver a generar hash, pero a expensas de una mayor complejidad del código.

3) cada vez que haya un conflicto, construya una tabla más grande y repita. Esto genera el beneficio de un código simple, pero el inconveniente de que no hay garantía de que aumentar el tamaño de la matriz de la tabla hash en realidad evitará otro conflicto al insertar los valores existentes en la nueva tabla hash.

De ellos, 2 es probablemente el más útil, pero aún existe un costo mayor que el constante para el acceso CRUD a los artículos dentro de un depósito individual.

La mejor solución posible que aumenta el tamaño si la matriz de la tabla hash es O (n lg (n)) complejidad amortizada. Esto se hace duplicando el tamaño de la matriz cuando se activa ese evento.

La solución que utiliza árboles equilibrados tiene una complejidad de n lg (n)) donde n es el tamaño del cubo más grande.

La inserción de hash O (1) es un mito común de los viejos tiempos. Sin supuestos adicionales como los límites de longitud de la clave, ni siquiera puede hacer una clave en O (1) . Si tiene límites de longitud de clave como ” todas las claves tienen menos de 16 bits”, entonces la pregunta asintótica no tiene sentido, ya que solo está agregando duplicados a la tabla hash a medida que N aumenta hacia el infinito. El mejor hashing realista en el caso asintótico para N claves distintas es O (log N) por inserción de clave porque necesita registrar N bits para describir N claves distintas y la función hash debe examinar cada bit en el caso general. Tenga en cuenta que esto hace que las tablas hash y los árboles equilibrados sean equivalentes en términos de rendimiento asintótico. Incluso este modelo solo tiene un sentido teórico de la información abstracta: las computadoras uni-procesadoras físicas (no cuánticas) reales son aún más limitadas en el caso asintótico: podemos suponer que cada bit requiere una cantidad mínima de volumen V. Por lo tanto, N bits de almacenamiento requieren una raíz cúbica de N radio esférico en el empaque óptimo en tres dimensiones. La información no puede viajar más rápido que la velocidad de la luz. Esto significa que el costo real de la inserción o recuperación en nuestro universo físico para las computadoras uni-procesador clásicas termina siendo un tiempo O (N ^ (1/3)) por inserción o recuperación a medida que la tabla se agranda incluso antes de abordar los problemas prácticos de costo, consumo de energía, disipación de calor, etc.

En términos prácticos, incluso con problemas de tamaño real, las tablas hash están más cerca del tiempo O (log N) que O (1) . Vea, por ejemplo, este punto de referencia de la marca hash: esta tabla hash es más rápida que una matriz de Judy Observe cómo el tiempo de inserción aumenta gradualmente a medida que se hace más grande.

Existe un algoritmo para expandir matrices con un costo de O (1) amortizado. Por ejemplo, cuando está lleno, cree una nueva matriz que sea el doble del tamaño. Copia todos los elementos. Esto parece costoso, pero en promedio, no es tan malo. Intenta resolverlo tú mismo y has respondido tu propia pregunta. Si necesita más ayuda, le di las palabras “costo amortizado”.

More Interesting

Para aprender la codificación, ¿primero se debe aprender un lenguaje o algoritmos?

¿Desglosar el problema en piezas más pequeñas siempre ofrece una mejor solución?

¿Tengo que hacer programación competitiva si estoy aprendiendo la estructura de datos y los algoritmos, mientras que la programación competitiva me distrae o primero tengo que aprender la estructura de datos y el algoritmo por completo y luego saltar a la programación competitiva?

Estoy obteniendo una precisión del 52% en los datos de mi celda, como el volumen, etc., que son valores extremadamente pequeños. He usado el árbol de decisión. ¿Cómo puedo mejorar?

¿Cuál es la intuición detrás del algoritmo de clasificación rápida de múltiples claves?

¿Cuál es la complejidad temporal de las funciones incorporadas en C ++?

Paso mucho tiempo pensando en el diseño, por lo que la implementación es terriblemente lenta. ¿Cómo supero este problema?

¿Cuál es la habilidad más importante para desarrollar en algoritmos?

¿Cuál es el mejor algoritmo de detección de colisión de vehículos?

¿Cómo implementas quicksort en c? Sé que hay respuestas disponibles en línea, pero estoy buscando idealmente la forma más elegante.

¿Cuál es el mejor algoritmo de clasificación para matrices aproximadamente ordenadas?

¿Qué significa <K extiende comparables > en Java en el contexto de hacer árboles de búsqueda binarios?

Cómo evitar buscar directamente una solución al resolver problemas de algoritmos

¿Qué estructuras de datos y algoritmos de programación heredados se enseñan en la universidad pero que no se usan después de la academia? ¿Aún debemos aprenderlos?

¿Son los algoritmos de big data de caja negra una instancia de historia que se repite? ¿Qué está haciendo la comunidad de código abierto para crear algoritmos de big data transparentes y precisos?