Erlang持久数据结构

时间:2010-11-05 09:44:49

标签: clojure erlang

据我了解,当您使用以下表达式创建新列表时,Erlang不会复制L1,而只会复制H

L2 = [H|L1]

Erlang是否具有dict的持久性数据结构(请参阅Persistent data structure),也就是说,当您在树中添加/删除/修改节点时,只复制了少数元素(如{{} 3}})?

2 个答案:

答案 0 :(得分:12)

使用[H|T]构建列表时,您误解了这种情况。正如您所说,T未被复制,但H也未被复制。所有发生的事情都是T前面有一个新的列表单元格,其中H为其头部(尾部为T)。使用列表时,创建的唯一位是实际列表单元格,而不是每个单元格中的数据。

使用dict时会发生同样的情况。在dict中修改(添加/删除元素)时,仅修改实际的dict结构,而不修改dict中的实际数据。此外,它很聪明,只能复制dict结构,以便进行修改。

所以,是的,Erlang拥有持久的数据结构。在这方面,clojure就像Erlang(我们在它之前就已经很久了)。

答案 1 :(得分:2)

根据我的经验,库模块的数据结构在性能或内存压力变大时不会降低。

对于dict,它使用动态哈希表作为内部数据结构,并且工作基本上仅在完成修改的存储桶上完成。

我还查看了我发现评论的gb_trees模块:

  

行为是对数的(应该是)。

而且gb_trees通常非常快,所以我很确定没有太多的复制正在进行。

通常,如果您使用Erlang等语言实现这些数据结构,则需要处理复制问题,因此无需担心通用库函数。


我重读了有关持久性数据结构的文章:就本文而言,Erlang的数据结构是完全持久的,也是一种持久的持久性。