stringtranslate.com

Trie mapeado en matriz hash

Un trie mapeado en una matriz hash [1] ( HAMT ) es una implementación de una matriz asociativa que combina las características de una tabla hash y un trie mapeado en una matriz . [1] Es una versión refinada de la noción más general de un árbol hash .

Operación

Un HAMT es un trie mapeado en una matriz donde las claves primero se codifican para asegurar una distribución uniforme de claves y una longitud de clave constante.

En una implementación típica del trie mapeado en matriz de HAMT, cada nodo contiene una tabla con un número fijo N de ranuras, y cada ranura contiene un puntero nulo o un puntero a otro nodo. N es comúnmente 32. Como asignar espacio para N punteros para cada nodo sería costoso, cada nodo contiene en cambio un mapa de bits que tiene una longitud de N bits, donde cada bit indica la presencia de un puntero distinto de nulo. A esto le sigue una matriz de punteros con una longitud igual a la cantidad de unos en el mapa de bits (su peso Hamming ).

Ventajas de los HAMT

El trie mapeado en matriz hash logra una velocidad similar a la de una tabla hash mientras utiliza la memoria de manera mucho más económica. Además, es posible que sea necesario redimensionar periódicamente una tabla hash, una operación costosa, mientras que las HAMT crecen de manera dinámica. En general, el rendimiento de las HAMT mejora con una tabla raíz más grande con algunos múltiplos de N ranuras; algunas variantes de las HAMT permiten que la raíz crezca de manera diferida [1] con un impacto insignificante en el rendimiento.

Detalles de implementación

La implementación de una HAMT implica el uso de la función de conteo de población , que cuenta la cantidad de unos en la representación binaria de un número. Esta operación está disponible en muchas arquitecturas de conjuntos de instrucciones , pero solo está disponible en algunos lenguajes de alto nivel . Aunque el conteo de población se puede implementar en software en tiempo O(1) utilizando una serie de instrucciones de desplazamiento y adición , al hacerlo, la operación puede ser un orden de magnitud más lenta. [ cita requerida ]

Implementaciones

Los lenguajes de programación Clojure , [2] Scala y Frege [3] utilizan una variante persistente de intentos mapeados en matrices hash para su tipo de mapa hash nativo. La biblioteca Haskell "unordered-containers" utiliza la misma para implementar estructuras de datos de mapas y conjuntos persistentes. [4] Otra biblioteca Haskell "stm-containers" adapta el algoritmo para su uso en el contexto de la memoria transaccional de software . [5] También está disponible una biblioteca HAMT de Javascript [6] basada en la implementación de Clojure. La implementación Rubinius [7] de Ruby incluye una HAMT, escrita principalmente en Ruby pero con 3 [8] primitivas. Los mapas grandes en Erlang utilizan una representación HAMT persistente internamente desde la versión 18.0. [9] El lenguaje de programación Pony utiliza una HAMT para el mapa hash en su paquete de colecciones persistentes. [10] Las cajas im e im-rc, que proporcionan tipos de colecciones persistentes para el lenguaje de programación Rust, utilizan una HAMT para sus tablas hash y conjuntos hash persistentes. [11]

La versión concurrente sin bloqueos [12] del hash trie, denominada Ctrie, es una implementación mutable y segura para subprocesos que garantiza el progreso. Se ha demostrado que la estructura de datos es correcta [13] - Se ha demostrado que las operaciones Ctrie tienen propiedades de atomicidad , linealización y ausencia de bloqueos .

Véase también

Referencias

  1. ^ a b C Phil Bagwell (2000). Árboles de hachís ideales (PDF) (Reporte). Departamento de Infociencia, École Polytechnique Fédérale de Lausanne .
  2. ^ "clojure/clojure". GitHub . 8 de diciembre de 2022.
  3. ^ "Frege/frege". GitHub . 7 de diciembre de 2022.
  4. ^ Johan Tibell, A. Anuncio de contenedores no ordenados 0.2
  5. ^ Nikita Volkov, Anuncio de la biblioteca "stm-containers", 2014
  6. ^ "mattbierner/hamt". GitHub . 27 de noviembre de 2022.
  7. ^ "Archivo fuente de Ruby del HAMT de Rubinius". GitHub .
  8. ^ https://github.com/rubinius/rubinius/blob/master/machine/builtin/system.cpp#L1724-L1802 [ enlace roto ]
  9. ^ "Lenguaje de programación Erlang".
  10. ^ "horse: Pony es un lenguaje de programación de código abierto, de alto rendimiento, con modelos de actores y con seguridad de capacidades: Ponylang/ponyc". GitHub . 2018-11-26.
  11. ^ "Documentación de la API para el paquete im-rc de Rust".
  12. ^ Prokopec, A. Implementación de intentos de hash simultáneos en GitHub
  13. ^ Prokopec, A. et al. (2011) Intentos de hash simultáneos sin bloqueo y con reconocimiento de caché. Informe técnico, 2011.