¿En qué se diferencia una tabla hash de una lista vinculada o una matriz?

Tomemos un ejemplo práctico. Digamos que tiene un libro de contactos, nombres, números de teléfono, direcciones. Las acabas de escribir cuando conociste a esas personas, no ordenadas alfabéticamente.

Ahora desea almacenarlos en una computadora para poder escribir más rápidamente el nombre del tipo y su información aparecerá:

Primero crea una estructura de registro para agrupar toda esa información en un elemento que puede usar más fácilmente. El registro tiene tipos de campos como cadena para nombre, tel y addr.

Así que ahora elige la estructura de datos que desea recopilar todos estos registros de contacto:

Formación

Cada registro se coloca uno al lado del otro en la RAM. Entonces sabe que su registro tiene una longitud de X bytes, por lo tanto, el 3er registro comienza en la posición “inicio de matriz + 2 longitudes de registro”.

Lista enlazada

Cada registro se asigna a donde el administrador de memoria considere más aplicable en este momento. Obtiene la ubicación donde se asignó y la guarda en el campo “siguiente” del registro anterior. Solo tiene un valor en su estructura de datos … la cabeza con la ubicación del primer elemento.

Tabla de picadillo

Haces una matriz que es más larga de lo que necesitas. Se calcula un valor numérico a partir del nombre utilizando una fórmula hash. Que luego usa para definir una posición dentro de esa matriz. En el que almacena ese nombre en particular y su información. Haz lo mismo para el resto. Si encuentra que la posición ya está ocupada, vuelva a crear un nuevo hash hasta obtener un lugar vacío.

Ahora, ingrese el nombre Jhon. ¿Qué pasa en cada uno?

Formación

Establezca una variable de índice en 0. Haga un bucle hasta que se encuentre o el índice pase el final de la matriz. Dentro del bucle, verifique esa posición en la matriz contra Jhon. ¿El nombre del registro actual es el mismo? Si es así, detente, lo has encontrado. De lo contrario, incremente el índice y regrese al inicio del ciclo.

Lista enlazada

Obtenga el primer registro señalado por la variable head. Haga un bucle hasta que no sea nulo, o si su campo de nombre es igual a Jhon. De lo contrario, dentro del bucle, establezca el registro actual a lo que apunte el siguiente campo del registro actual.

Tabla de picadillo

Calcule el valor hash de Jhon. Úselo como índice en la matriz. Si esa posición contiene un registro con el nombre Jhon, lo has encontrado. Si no, vuelva a llamar el hash e intente nuevamente.

¿Qué significa esto practicamente? Tanto en la matriz como en la lista vinculada, tendría que recorrer (en promedio) la mitad de los elementos para encontrar cualquiera con un nombre Jhon, es decir, la cantidad de búsquedas realizadas está relacionada linealmente con el número de elementos almacenados O (N ) En la tabla hash, lo más probable es que solo necesite calcular el hash una vez, y tenga Jhon, es decir, O (1). Incluso si no es el primer cálculo, es probable que solo sea un puñado en una lista de 1000, depende de la calidad de la fórmula hash.

Estrictamente hablando, realmente no se puede comparar una matriz (o LL para el caso) con una tabla hash. Los dos primeros son colecciones genéricas. La última es una colección de búsqueda, destinada a la búsqueda. Sin mencionar que una tabla hash se implementa (generalmente) encima de una matriz, la matriz forma parte de ella.

Una mejor comparación podría ser una matriz ordenada o un árbol de búsqueda binario. Los dos están relacionados con la matriz y la lista vinculada, respectivamente. Sin embargo, en ambos casos son más lentos que una tabla hash: solo reducirían las posibilidades de búsqueda a la mitad para cada elemento verificado, mientras que un hash llega allí en un movimiento casi siempre. Lo mismo ocurre al insertar, en la matriz ordenada, necesitaría mover todos los elementos después de la posición donde desea insertar uno por uno, es decir, después de encontrar la posición, una O (N) después de una O (log N ) En el BST, ubicaría la última hoja después de intentar encontrar el elemento con el mismo nombre que desea insertar. Luego configure el nuevo elemento como su puntero izquierdo o derecho. De nuevo … una operación O (log N). En la tabla hash, es solo una operación O (1).

Las matrices y las listas vinculadas son estructuras de datos que almacenan una colección de elementos en un orden específico.

En las matrices, este orden es fijo y se accede a ellas secuencialmente por número de índice (como un número de armarios de almacenamiento numerados en una fila).

En las listas vinculadas, los elementos pueden estar teóricamente en cualquier lugar de la memoria, y cada uno también tiene la dirección en memoria de la siguiente. Piensa en un brazalete de cuentas. Esto significa que no puede acceder a ningún elemento usando un número de índice fácilmente (= rápidamente), pero debe comenzar por el primero cada vez para buscar el que desea. Si ha encontrado un determinado elemento en la lista, sin embargo, puede eliminarlo fácilmente de la lista por completo o insertar un nuevo elemento en esa ubicación simplemente cambiando un par de enlaces locales entre los elementos, mientras deja intacto el resto de la estructura de datos. .

Una tabla hash es diferente de cualquiera porque realmente no almacena sus elementos en ningún orden en particular (que podría serle útil); es una colección desordenada de elementos con tiempos de acceso diferentes, generalmente rápidos, para los elementos, que en la práctica pueden estar en algún lugar entre la matriz y la lista vinculada en función de cómo se implementa y utiliza exactamente.

More Interesting

¿Es posible crear un algoritmo de búsqueda mejor que el de Google?

¿Qué es una matriz?

Cómo crear un sistema de clasificación que dependa de tres variables (nivel, resultado y tiempo) cuanto más altas sean las dos primeras, mejor, mientras que por un tiempo, un valor menor es mejor

Cómo crear un programa PHP que muestre los enteros en orden por las veces que se repiten en la matriz

Como estudiante de primer año de una sucursal que no es CS en un IIT, ¿cómo domino las estructuras de datos, los algoritmos y el aprendizaje automático por mi cuenta?

Cómo alterar el rango de un bucle for dentro del bucle en Python

Cómo agregar números de dos listas vinculadas

¿Qué prueba de primalidad se usa en las aplicaciones de software convencionales?

¿Cuáles son los algoritmos de coincidencia de patrones más comunes?

¿Qué tan buena es la calidad de los problemas de HackerRank en comparación con los problemas de Topcoder, Codeforces, Codechef?

Cómo abordar y resolver problemas complejos de codificación o algoritmos

Cómo verificar si un número es un primo retorcido o no usa bucle

¿Qué algoritmo en aprendizaje automático es el más adecuado para unir los datos entrantes nuevos con los datos existentes en la base de datos SQLite?

Si un hombre está limitado por el conocimiento, ¿podemos crear un algoritmo para sus elecciones y determinar su futuro?

Si F2L se resuelve mejor de forma intuitiva, ¿por qué cada tutorial incluye algoritmos para todos los casos de F2L?