Tengo un requisito simple (quizás hipotético):trie o árbol de búsqueda binaria equilibrada para almacenar el diccionario?
Quiero almacenar diccionario de palabras inglés (n palabras) y dado una palabra (longitud de caracteres m), el diccionario puede decir si la palabra existe en el diccionario o no. ¿Cuál sería una estructura de datos apropiada para esto?
¿un árbol de búsqueda binaria equilibrada? como se hace en las estructuras de datos STL asociativo C++, como conjunto, mapa
o
un trie en cadenas
Algunos análisis de complejidad: en un bst equilibrada, el tiempo sería (log n) * m (comparando 2 cadenas toma O (m) tiempo carácter por carácter)
en trie, si en cada nodo, podríamos ramificar en O (1) tiempo, podemos encontrar usando O (m), pero la suposición de que en cada nodo, podemos ramificar en O (1) el tiempo no es válido. en cada nodo, las ramas máximas posibles serían 26. si queremos O (1) en un nodo, mantendremos una matriz corta indexable en los caracteres de cada nodo. Esto hará explotar el espacio. Después de algunos niveles en el trie, la bifurcación se reducirá, por lo que es mejor mantener una lista vinculada de los siguientes caracteres e indicadores del nodo.
¿Qué aspecto más práctico? cualquier otra compensación?
Gracias,
gracias por dar un puntero al DAWG - un nuevo DS para mí. – xyz
+1 para la estructura de datos Trie – brainydexter
Dado que el único requisito especificado por el OP es la recuperación de claves, no veo por qué una Trie es una mejor estructura de datos que una Tabla hash. La tabla Hash funcionará mejor que una Trie y es más fácil de implementar. En el contexto de C++ STL, puede usar std :: unordered_set – minism