erlang中的数组实现

Mar*_*sen 4 memory erlang immutability

我的问题是,如何在Erlang中实现数组,而不是列表.

使用不可变类型执行的操作,

move ([X | Xs], Ys) ->
    [X | Ys].

Ls = move([1,2,3], [2,3,4])
Run Code Online (Sandbox Code Playgroud)

将占用堆中的常量mem,因为这是所有参考工作.

但对于数组中的相同内容

move (A1, A2) ->
    array:set(0, array:get(0,A1),A2).

A1 = array:from_list([1,2,3]).
A2 = array:from_list([0,2,3,4]).
A3 = move(A1,A2).
Run Code Online (Sandbox Code Playgroud)

move在这里使用的大小成正比,A2还是会能够做到这一点不变的空间像阵列?

rvi*_*ing 8

(希望)有点清楚.请记住,在Erlang中,所有数据都是不可变的!这极大地影响了您操作数据的方式.

array模块构建嵌套元组的结构,其中包含数据的所有数组槽位于同一级别.每个元组的大小为10,因此对于数组访问,我们有O(lg10(N)).使用这样的嵌套结构在具有不可变数据的语言中很常见.你可以将一个数组保存在一个平坦的元组中,这样可以快速读取,但是对于大型数组/元组,写入会变慢并占用内存,因为每次写入都需要创建一个新的元组.使用树结构意味着在写入中创建的数据少得多.

您的move/2函数如何影响内存使用量取决于您是否正在写入数组中已使用或未使用的插槽.如果插槽已在使用中,则结果内存使用情况将相同.如果您正在写入先前未使用的插槽,那么您可能需要增大阵列,这意味着将使用更多内存.

这与您的列表案例完全相同.

它还取决于是否存在对旧数据结构的任何剩余引用.