2010-11-05 60 views

回答

11

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

使用dict时会发生同样的情况。当您在dict中修改(添加/删除元素)时,只会修改实际的dict结构,而不是dict中的实际数据。此外,它也很聪明,只需复制尽可能少的dict结构即可进行修改。

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

+1

好的,我们不会在这里讨论指针和值,差别很明显,关键是如何使用具有持久性的大内存键值存储操作(因此没有ets)。我已经提到,在修改某些值的过程中,只有从根到该值的路径被复制(3-4个节点),并且我们有两棵树:新树和旧树。我们如何在erlang中做到这一点?框中的某些结构是否实现了这种行为? – adolgarev 2010-11-05 11:27:41

+0

'A = SomeTree,B =改变(A)。'你现在有B树和树中的一个,其中'B'是新的和'A'是旧..使用'{A,B}'在同一个元组把两棵树。这是你想知道的吗? – 2010-11-05 12:45:33

+0

NOP,我需要A = SomeTree,B =变化(A),A和B具有一些共同的一块,看http://en.wikipedia.org/wiki/Purely_functional#Trees – adolgarev 2010-11-05 13:01:37

2

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

对于字典而言,它使用动态散列表作为内部数据结构,工作基本上只在修改完成的存储桶上完成。

我也看了gb_trees模块在那里我找到了评论在:

行为是logaritmic(因为它应该是)。

gb_trees一般都很快,所以我很确信没有太多的复制正在进行。

一般来说,如果你用像Erlang这样的语言来实现像这样的数据结构,那么你需要照顾复制问题,所以不需要担心通用库函数的问题。


我重读关于持久数据结构的文章:在这篇文章的意义,Erlang的数据结构是完全持久的,也是持久的汇合。

+0

那么线性结构呢?是否有这样的事物作为具有这些性能保证的矢量(或一组事物)? – 2015-02-04 04:47:06

+0

是的,有..'数组'和fwiw'设置'...你甚至尝试看文档? – 2015-07-03 16:50:38