clojure - delete - Estructuras de datos persistentes de Erlang
list in erlang (2)
Ha malinterpretado la situación cuando construye una lista usando [H|T]
. Es como dices que T
no se copia, pero tampoco lo es H
Todo lo que sucede es que una nueva celda de lista se antepone a T
con una referencia a H
como su cabeza (su cola es T
). Al trabajar con listas, los únicos bits que se crean son las celdas de la lista real y nunca los datos en cada celda.
Lo mismo ocurre cuando se trabaja con dict
. Cuando modifica (agrega / elimina elementos) en el dict
solo se modifica la estructura del dict
real y no los datos reales en el dict
. También es inteligente para copiar solo la menor cantidad posible de la estructura dict
para realizar la modificación.
Entonces, sí, Erlang tiene estructuras de datos persistentes. En ese sentido, clojure es como Erlang (estuvimos mucho tiempo atrás).
Como he entendido, cuando creas una nueva lista con una expresión como la siguiente, Erlang no copia L1
, solo copia H
L2 = [H|L1]
¿Erlang tiene una estructura de datos persistente (ver Estructura de datos persistente ) para dict
, es decir, cuando agrega / elimina / modifica nodos en el árbol, solo se están copiando algunos elementos (como en Clojure )?
En mi experiencia, las estructuras de datos para el módulo de la biblioteca no se degradan en el rendimiento o la presión de la memoria cuando crecen.
Para un dict, utiliza una tabla hash dinámica como estructura interna de datos y el trabajo se realiza esencialmente solo en el depósito donde se realiza la modificación.
También busqué en el módulo gb_trees
donde encontré el comentario:
El comportamiento es logarítmico (como debería ser).
Y gb_trees
generalmente son bastante rápidos, así que estoy bastante seguro de que no está ocurriendo mucha copia.
En general, si implementa estructuras de datos como estas en un lenguaje como Erlang, se ocupa de los problemas de copia, por lo que no hay necesidad de preocuparse por las funciones generales de la biblioteca.
Volví a leer el artículo sobre estructuras de datos persistentes: en el sentido de este artículo, las estructuras de datos de Erlang son totalmente persistentes y confluentemente persistentes.