Las pruebas son estructuras de datos muy rápidas. Buscar una palabra toma el tiempo O (sizeofword), mientras que std::map
s son árboles autoacabados. ¿Por qué no se implementan las plantillas estándar de mapas C++ con los intentos? ¿Hay alguna razón específica? ¿Hay alguna compensación de usar un trie en lugar de un árbol de auto-equilibrio?¿Por qué no se implementan los mapas C++ como intentos?
Respuesta
Tries solo se puede utilizar cuando las claves que se almacenarán se pueden procesar dígito por dígito o carácter por carácter. Los C++ std::map
y std::set
están diseñados para funcionar con cualquier elemento comparable como clave, y por lo tanto no pueden implementarse de manera que procesen las teclas carácter por carácter. En su lugar (normalmente) utilizan árboles de búsqueda binaria equilibrada, que no necesitan introspección en las claves y, en su lugar, pueden usar un comparador para realizar búsquedas rápidas.
Si está seguro de que ciertas propiedades se conservan para sus llaves, en algunos casos puede incluso ser mejor que intentarlo (vea el ejemplo van Emde Boas tree). Sin embargo, los diseñadores de bibliotecas tienen que diseñar para muchos casos de uso y, por lo tanto, pueden necesitar elegir opciones que son más lentas que la mejor opción, ya que necesitan manejar la mayor cantidad de opciones posibles.
Además, es perfectamente posible que una implementación conforme a C++ contenga una especialización de std::map
o std::set
que utiliza un trie cuando las claves son cadenas. No creo que haga nada, pero en teoría es posible.
Espero que esto ayude!
Para conjuntos de datos más pequeños, el árbol equilibrado es probablemente más eficiente que las implementaciones de trie más comunes. Encuentro que el trie realmente solo se vuelve eficiente con conjuntos de datos más grandes. –
- 1. ¿Por qué los montones en C++ se implementan como algoritmos en lugar de contenedores?
- 2. ¿Cómo se implementan los C# Generics?
- 3. Mapa de mapas: ¿cómo mantener los mapas interiores como mapas?
- 4. ¿Qué aplicaciones impulsadas por eventos se implementan en Haskell?
- 5. ¿Por qué se implementan AsObservable y AsEnumerable de forma diferente?
- 6. ¿por qué se implementan comentarios condicionales en IE?
- 7. ¿Por qué InputStream y OutputStream implementan Cerrar y Socket no?
- 8. ¿Cómo se implementan los bloques try/catch?
- 9. ¿Por qué Silverlight o Flash no implementan sockets UDP?
- 10. ¿Las matrices de JavaScript realmente se implementan como matrices?
- 11. Ordenando mapas dentro de los mapas por valor
- 12. C# ¿Por qué no se pueden pasar los tipos genéricos como parámetros?
- 13. ¿Cómo se implementan los analizadores DOM?
- 14. Se requiere bloqueo y otros intentos de bloqueo no bloquean: ¿los bloqueadores C# son reentrantes?
- 15. javascript internals: cómo se implementan los eventos?
- 16. ¿Por qué el readf no se comporta como se esperaba?
- 17. ¿Por qué no se implementa JML como anotaciones en Java?
- 18. ¿Por qué las matrices multidimensionales C# no implementan IEnumerable <T>?
- 19. ¿Por qué se 'implementa' como 'como'?
- 20. ¿Por qué no se aplica Colspan como se esperaba?
- 21. ¿Por qué no está el operador [] const para los mapas STL?
- 22. ¿Cómo implementan los structs los genéricos?
- 23. ¿Por qué no podemos usar C-strings como SEL?
- 24. ¿Por qué no se detectan mis excepciones de C++?
- 25. Por curiosidad: ¿por qué las API de registro no implementan los métodos de registro de tipo printf()?
- 26. ¿Cómo se implementan los métodos, `classmethod` y` staticmethod` en Python?
- 27. ¿Por qué Java no tiene ningún destructor como C++?
- 28. alternativa a los mapas
- 29. ¿Por qué no en C++ de 11 se mueven constructor/asignación acto operador como se esperaba
- 30. ¿Por qué se nombran los registros x86 tal como son?
¿Cómo utilizarías un trie para almacenar algo que no sea una cadena (o al menos similar a un hilo)? –
¿Cómo se obtiene la complejidad de O (n) para trie? – n0rd
@ n0rd: O (n)! = O (sizeofword) ... –