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]
- ¿Qué algoritmo de búsqueda aplicaría para la siguiente matriz y por qué?
- Cómo resolver el problema ADDGP en SPOJ
- ¿Qué es el recorrido del árbol y por qué los necesita?
- ¿Cuál es el tiempo de ejecución para un recorrido en orden?
- ¿Cuáles son algunos lenguajes de programación que me permiten visualizar algoritmos?
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.