¿Cómo Puedo Elegir Entre una Tabla Hash y un Trie (Árbol de Prefijos)?


Entonces, si tengo que elegir entre una tabla hash o un árbol de prefijos, cuáles son los factores discriminantes que me llevarían a elegir uno sobre el otro. Desde mi propio punto de vista ingenuo, parece que usar un trie tiene una sobrecarga adicional, ya que no se almacena como una matriz, sino que en términos de tiempo de ejecución (suponiendo que la clave más larga es la palabra inglesa más larga) puede ser esencialmente O(1) (en relación con el límite superior). Tal vez la palabra más larga en inglés es de 50 caracteres?

Las tablas Hash son búsqueda instantánea una vez que obtenga el índice. Hash la clave para obtener el índice sin embargo, parece que podría tomar fácilmente cerca de 50 pasos.

¿Puede alguien darme una perspectiva más experimentada sobre esto? ¡Gracias!

Author: Justin Bozonier, 2008-10-29

8 answers

Ventajas de los intentos:

Lo básico:

  • Tiempo de búsqueda predecible de O(k) donde k es el tamaño de la clave
  • La búsqueda puede tomar menos de k tiempo si no está allí
  • Soporta recorrido ordenado
  • No hay necesidad de una función hash
  • La eliminación es sencilla

Nuevas operaciones:

  • Puede buscar rápidamente prefijos de claves, enumerar todas las entradas con un prefijo dado, etc.

Ventajas de linked estructura:

  • Si hay muchos prefijos comunes, el espacio que requieren es compartido.
  • Los intentos inmutables pueden compartir estructura. En lugar de actualizar un trie en su lugar, puede construir uno nuevo que sea diferente solo a lo largo de una rama, apuntando en otro lugar al trie antiguo. Esto puede ser útil para la concurrencia, múltiples versiones simultáneas de una tabla, etc.
  • Un trie inmutable es compresible. Es decir, puede compartir estructura en los sufijos también, por hash-consing.

Ventajas de los hashtables:

  • Todo el mundo conoce los hashtables, ¿verdad? Su sistema ya tendrá una buena implementación bien optimizada, más rápido que los intentos para la mayoría de los propósitos.
  • Sus llaves no necesitan tener ninguna estructura especial.
  • Más eficiente en el espacio que la estructura trie vinculada obvia (ver comentarios a continuación)
 105
Author: Darius Bacon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-22 19:50:56

Todo depende del problema que estés tratando de resolver. Si todo lo que necesita hacer son inserciones y búsquedas, vaya con una tabla hash. Si necesita resolver problemas más complejos, como consultas relacionadas con prefijos, entonces un trie podría ser la mejor solución.

 43
Author: Adam Rosenfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 05:25:20

Todo el mundo conoce la tabla hash y sus usos , pero no es exactamente constante buscar tiempo , depende de qué tan grande es la tabla hash, la complejidad computacional de la función hash.

Crear enormes tablas hash para una búsqueda eficiente no es una solución elegante en la mayoría de los escenarios industriales donde incluso la pequeña latencia/escalabilidad importa (por ejemplo, el comercio de alta frecuencia). También debe preocuparse por las estructuras de datos para optimizarlas para el espacio que ocupa en la memoria para reducir la caché perder.

Un muy buen ejemplo donde trie se adapta mejor a los requisitos es el middleware de mensajería . Usted tiene un millón de suscriptores y editores de mensajes a varias categorías (en términos JMS - Temas o intercambios) , en tales casos si desea filtrar los mensajes basados en temas (que en realidad son cadenas) , definitivamente no desea crear una tabla hash para el millón de suscripciones con millones de temas . Un mejor enfoque es almacenar los temas en trie, por lo que cuando se realiza el filtrado basado en coincidencia de tema, su complejidad es independiente del número de temas / suscripciones / editores (solo depende de la longitud de la cadena). Me gusta porque puede ser creativo con esta estructura de datos para optimizar los requisitos de espacio y, por lo tanto, tener una menor pérdida de caché.

 23
Author: user179156,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-15 05:57:34

Utilice un árbol:

  1. Si necesita la función de autocompletar
  2. Encuentra todas las palabras que comienzan con 'a' o 'axe', etc.
  3. Un árbol sufijo es una forma especial de un árbol. Los árboles de sufijos tienen toda una lista de ventajas que el hash no puede cubrir.
 8
Author: Dr.Sai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-12 10:42:53

Hay algo que no he visto a nadie mencionar explícitamente que creo que es importante tener en cuenta. Tanto las tablas hash como los intentos de varios tipos típicamente tendrán operaciones O(k), donde k es la longitud de la cadena en bits (o equivalentemente en caracteres).

Esto es asumiendo que tienes una buena función hash. Si no desea que" farm "y" farm animals "tengan el mismo valor, entonces la función hash tendrá que usar todos los bits de la clave, y así hashing" farm animals" debería tomar aproximadamente el doble de tiempo que "farm" (a menos que esté en algún tipo de escenario de hash continuo, pero también hay escenarios de ahorro de operaciones similares con intentos). Y con un intento de vainilla, está claro por qué insertar "animales de granja" tomará aproximadamente el doble de tiempo que solo "granja". A la larga, también es cierto con los intentos comprimidos.

 1
Author: user3391564,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-16 12:40:26

HashTable implementation is space efficient as compared to basic Trie implementation. Pero con las cadenas, ordenar es necesario en la mayoría de las aplicaciones prácticas. Pero HashTable perturba totalmente el orden lexográfico. Ahora, si su aplicación está haciendo operaciones basadas en el orden lexográfico (como búsqueda parcial, todas las cadenas con prefijo dado, todas las palabras en orden ordenado), debe usar Tries. Para solo buscar, se debe usar HashTable (como podría decirse, da un mínimo tiempo de búsqueda).

P.d.: Aparte de estos, Los Árboles de Búsqueda Ternaria (TSTs) serían una excelente opción. Su tiempo de búsqueda es más que HashTable, pero es eficiente en el tiempo en todas las demás operaciones. Además, su espacio más eficiente que tries.

 1
Author: Jay Jodiwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-18 16:05:39

La inserción y búsqueda en un trie es lineal con la longitud de la cadena de entrada O(s).

Un hash le dará una O(1) para la búsqueda y la inserción, pero primero debe calcular el hash basado en la cadena de entrada que nuevamente es O(s).

Conclussion, la complejidad asintótica del tiempo es lineal en ambos casos.

El trie tiene algo más de sobrecarga desde la perspectiva de los datos, pero puede elegir un trie comprimido que lo pondrá de nuevo, más o menos en un empate con el hash tabla.

Para romper el empate hágase esta pregunta: ¿Necesito buscar solo palabras completas? ¿O tengo que devolver todas las palabras que coincidan con un prefijo? (Como en un sistema predictivo de entrada de texto). Para el primer caso, ir a por un hachís. Es un código más simple y limpio. Más fácil de probar y mantener. Para un caso de uso más elaborado donde los prefijos o sufijos importan, vaya por un trie.

Y si lo haces solo por diversión, implementar un trie le daría un buen uso a una tarde de domingo.

 0
Author: Visiedo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-19 17:16:23

Algunas aplicaciones (generalmente incrustadas, en tiempo real) requieren que el tiempo de procesamiento sea independiente de los datos. En ese caso, una tabla hash puede garantizar un tiempo de ejecución conocido, mientras que un trie varía en función de los datos.

 -1
Author: Adam Liss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-29 05:31:49