¿Cuál es la forma más eficiente para que un programador principiante entienda las tablas hash y los intentos?

Bueno, para los programadores principiantes, la forma más eficiente de comprender un tema, si existe, sería abordar el tema en dos pasos.

  • Lea algunos capítulos de libros sobre el tema para comprender su mecanismo de trabajo teóricamente
  • Implemente el tema usando un lenguaje de programación

De hecho, creo que Trie es mucho más fácil que las tablas hash. Algunos blogs, como Trie | (Insertar y buscar) – GeeksforGeeks y The Trie: A Neglected Data Structure ya son suficientes para que lo entiendas. Si puede resolver Implementar Trie (Árbol de prefijos) | LeetCode OJ, creo que has entendido a Trie, al menos en el nivel más fundamental.

Para las tablas hash, implica más variaciones y análisis algorítmicos más complicados. Le recomendaría que primero consulte algunos buenos libros de Algoritmo para comprender su mecanismo. Luego intente implementarlo (puede ver algunos blogs, por ejemplo, implementaciones). Y lea más sobre esto para refinar sus implementaciones o pruebe otras formas.

De hecho, también estoy aprendiendo tablas hash.

No sé acerca de las “formas más eficientes”, ya que la velocidad con la que un codificador novato puede absorber estos conceptos depende en cierta medida de la eficiencia de su cerebro … Pero sé que Wikipedia hace un mejor trabajo de lo que podría (en una respuesta de Q&D Quora , de todos modos), por lo que debe verificar estos wikis (comienzo decente):

► tabla hash
► Árbol de matriz hash
► Matriz de hash mapeado trie
► Hash tree (estructura de datos persistente)

Ver también:

► Ctrie
► C-trie

Y estoy totalmente de acuerdo con Malcolm Teas : ¡las imágenes ayudan a resolver las cosas en la mente! Aquí hay una buena (capta la idea de “tabla hash” bastante bien):

Imagen de tabla hash levantada de Wikimedia Commons (creado por Jorge Stolfi )

También hay un número prácticamente incontable de tutoriales en línea disponibles, consulte, por ejemplo, http://www.tutorialspoint.com , ¡sus estructuras de datos y algoritmos son IMO bastante excelentes!

Hay muchas cosas relacionadas en Youtube (calidad desconocida), aquí hay un clip con bastantes vistas (si puede soportar un cierto uso excesivo de la palabra “básicamente”):

Si el principiante nunca ha encontrado listas vinculadas (necesarias si hay más de un hash clave en el mismo grupo), puede echar un vistazo a mi respuesta a ¿Qué es una cola prioritaria? ¿Cuáles son algunos ejemplos?

¡Buena suerte y diviertete!

Esto sonaría un poco pesimista y / o nostálgico, lo siento.

Creo que cada método (ya sea un algoritmo o una estructura de datos) debe aprenderse con algún caso de uso sólido. De lo contrario, es solo un conocimiento memorizado. Hash es un método que traduce datos heredados y preferiblemente únicos en un registro en un índice único del almacenamiento utilizado. Aquí hay una descripción muy buena (e inútil si aún no la conoce) de hash.

Aprendí Hash en el invierno de 1992 y lo entendí en junio de 1993, durante una sesión de codificación después de la medianoche en un i486 DX 2 × 40 usando Borland C. Durante ese período de 8 a 9 meses, estaba tratando de entender por qué demonios uno necesita convierta la variable de índice en una forma más compleja de lo que ya es, en lugar de simplificarla. Luego tuve un proyecto (cuyos detalles te aburrirían) en el que necesitaba un método para almacenar datos relacionados con varios tipos diferentes de tuberías con diferentes tamaños e históricamente. Y este almacenamiento sería un archivo binario indexado en el que estaba empujando las estructuras de datos de mi programa directamente. He trabajado durante una semana o tal vez diez días sin éxito, y luego, en resumen, escribí una función de traducción y funcionó. Al día siguiente, cuando desperté, me di cuenta de que escribí una función Hash específica para el caso.

Mi punto es; Aparte de la mayoría de los detalles dados anteriormente, necesitaba desarrollar un almacenamiento binario, porque antes, especialmente en el entorno de PC, no era muy común usar rdbms, por lo que era necesario desarrollar dichos formatos de almacenamiento. En estos días, simplemente inserta los datos en la base de datos y se indexa y optimiza allí automáticamente.

Si mi recomendación no es obvia; Intente emular un almacenamiento de indexación simple en un archivo binario propio. Se vería obligado a desarrollar un hash, preferiblemente sin colisión.

A2A.

PSA: El “intento” OP significa que es trie.

(De Wikipedia)

En informática, un trie , también llamado árbol digital y, a veces, árbol de radix o árbol de prefijos (ya que pueden buscarse por prefijos), es una especie de árbol de búsqueda, una estructura de datos de árbol ordenada que se utiliza para almacenar un conjunto dinámico o asociativo matriz donde las teclas suelen ser cadenas.

Pero para justificar el hecho de que la pregunta es demasiado ambigua al principio, hablemos de los árboles …

  • Las tablas hash y los árboles son técnicas avanzadas en informática
  • Eran mucho más abstractos que las pilas, las listas enlazadas y los conjuntos.
  • Por ejemplo, necesita una función hash para tablas hash
  • Debe asignar depósitos para las entradas hash (a menos que vaya a sondeo lineal / cuadrático que de hecho tiene una complejidad de tiempo de O (1))
  • Básicamente, la tabla Hash es la función Linked List / Stack + Hash para indexar la clave + búsqueda lineal.
  • ¿Qué hay de los árboles?
  • Bueno, mi primera idea es ver los árboles como una lista vinculada multidimensional.
  • Para el árbol n-ario, el árbol unario es exactamente una lista doblemente vinculada.
  • Tendría que hacer mapas de un árbol n-ary para aclarar la relación entre padres e hijos.
  • Recuerde, los árboles pueden ser asimetría, lo que significa que cada árbol n-ario puede contener otro árbol n-ario con el n no exactamente el n del padre.
  • Los árboles también pueden tener perfección e imperfección. Equilibrado y desequilibrado. Además de Binary Tree, tenemos Radix / Suffix Tree, Binary Search Tree (BST), B Tree, B + Tree y Red Black tree, o incluso kd Tree y Quadtree / Octree. Tienen características y rasgos diferentes, ¡así que úsalos con sabiduría!

En general para estructuras de datos complejas: Dibuje imágenes.

Es lo que aclara las cosas. Haga dibujos de antes de la operación y después de la operación que está ilustrando. Y para cosas complejas o de varios pasos, dibuje cada paso. Esto es lo que funcionó para mí cuando estaba aprendiendo estas cosas.

Una vez que haya dibujado las imágenes, puede recordarlas en su mente y mantenerlas claras. Sin embargo, es bastante difícil hacerlo solo con palabras.