据我所知,当您创建一个类似下列表达式的新列表时,Erlang不会复制L1
,它只是复制H
。Erlang持久数据结构
L2 = [H|L1]
二郎是否有持续性的dict
的数据结构(见Persistent data structure),也就是说,当您在树中只有少数元素被复制(如在Clojure)添加/删除/修改节点?
据我所知,当您创建一个类似下列表达式的新列表时,Erlang不会复制L1
,它只是复制H
。Erlang持久数据结构
L2 = [H|L1]
二郎是否有持续性的dict
的数据结构(见Persistent data structure),也就是说,当您在树中只有少数元素被复制(如在Clojure)添加/删除/修改节点?
当您使用[H|T]
构建列表时,您误解了这种情况。正如您所说,T
未被复制,但也不是H
。发生的情况是,一个新的列表单元格前置于T
,并以H
作为其头部(其尾部为T
)。使用列表时,唯一创建的位是实际列表单元,而不是每个单元中的数据。
使用dict
时会发生同样的情况。当您在dict
中修改(添加/删除元素)时,只会修改实际的dict
结构,而不是dict
中的实际数据。此外,它也很聪明,只需复制尽可能少的dict
结构即可进行修改。
所以,是的,Erlang拥有持久的数据结构。在这方面,clojure就像Erlang(我们早在它之前)。
根据我的经验,库模块的数据结构在性能或内存压力变大时不会降级。
对于字典而言,它使用动态散列表作为内部数据结构,工作基本上只在修改完成的存储桶上完成。
我也看了gb_trees
模块在那里我找到了评论在:
行为是logaritmic(因为它应该是)。
和gb_trees
一般都很快,所以我很确信没有太多的复制正在进行。
一般来说,如果你用像Erlang这样的语言来实现像这样的数据结构,那么你需要照顾复制问题,所以不需要担心通用库函数的问题。
我重读关于持久数据结构的文章:在这篇文章的意义,Erlang的数据结构是完全持久的,也是持久的汇合。
那么线性结构呢?是否有这样的事物作为具有这些性能保证的矢量(或一组事物)? – 2015-02-04 04:47:06
是的,有..'数组'和fwiw'设置'...你甚至尝试看文档? – 2015-07-03 16:50:38
好的,我们不会在这里讨论指针和值,差别很明显,关键是如何使用具有持久性的大内存键值存储操作(因此没有ets)。我已经提到,在修改某些值的过程中,只有从根到该值的路径被复制(3-4个节点),并且我们有两棵树:新树和旧树。我们如何在erlang中做到这一点?框中的某些结构是否实现了这种行为? – adolgarev 2010-11-05 11:27:41
'A = SomeTree,B =改变(A)。'你现在有B树和树中的一个,其中'B'是新的和'A'是旧..使用'{A,B}'在同一个元组把两棵树。这是你想知道的吗? – 2010-11-05 12:45:33
NOP,我需要A = SomeTree,B =变化(A),A和B具有一些共同的一块,看http://en.wikipedia.org/wiki/Purely_functional#Trees – adolgarev 2010-11-05 13:01:37