gpt4 book ai didi

memory - erlang中的数组实现

转载 作者:行者123 更新时间:2023-12-04 22:47:54 25 4
gpt4 key购买 nike

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

使用不可变类型做类似的事情,

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

Ls = move([1,2,3], [2,3,4])

将占用堆中的常量内存,因为这都是引用工作。

但是对于数组中的相同内容
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).

move这里使用与 A2 成比例的大小,还是能够像数组一样在恒定空间中执行此操作?

最佳答案

(希望)把事情弄清楚一点。请记住,在 Erlang 全部 数据是不可变的!这会深刻影响您处理数据的方式。
array模块构建嵌套元组的结构,其中包含数据的所有数组槽都处于同一级别。每个元组的大小为 10,因此对于数组访问,我们有 O(lg10(N))。像这样使用嵌套结构在具有不可变数据的语言中很常见。您可以将数组保存在一个平面元组中,这样可以快速读取,但写入会变得很慢,并且对于大型数组/元组会占用内存,因为每次写入都需要创建一个新元组。使用树结构意味着在写入中创建的数据要少得多。

您的 move/2函数影响内存使用在一定程度上取决于您是写入数组中已使用的插槽还是未使用的插槽。如果插槽已在使用中,则生成的内存使用量将相同。如果您正在写入以前未使用的插槽,那么您可能需要增加数组,这意味着将使用更多内存。

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

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

关于memory - erlang中的数组实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16447921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com