【问题标题】:Is there a module that implements an efficient array type in Erlang?有没有在 Erlang 中实现高效数组类型的模块?
【发布时间】:2012-09-05 21:08:05
【问题描述】:

我一直在寻找Erlang中具有以下特点的数组类型。

append(vector(), term())        O(1) 
nth(Idx, vector())              O(1)
set(Idx, vector(), term())      O(1)
insert(Idx, vector(), term())   O(N)
remove(Idx, vector())           O(N)

我通常为此使用元组,但性能特征不是我想要的大 N。我的测试显示以下性能特征...

erlang:append_element/2          O(N).
erlang:setelement/3              O(N).

我已经开始基于 clojure.lang.PersistentVector 实现的模块,但如果已经完成,我不会重新发明轮子。

编辑:

对于那些感兴趣的人,我已经完成了vector.erl 的实现......使用与clojure.lang.PersistentVector 相同的算法。它具有与数组模块相似的性能特征,但在追加时具有稍好的常数因子。

以下测试在每个间隔附加 10000 个项目,然后在随机索引处进行 10000 次查找和 10000 次更新。所有操作都接近 O(1)。内部元组中的时间以微秒为单位。

3> seq_perf:test(vector, 100000, 10).
{2685854,
 {ok,[{100000,{66966,88437,124376}},
      {200000,{66928,76882,125677}},
      {300000,{68030,76506,116753}},
      {400000,{72429,76852,118263}},
      {500000,{66296,84967,119828}},
      {600000,{66953,78155,116984}},
      {700000,{65996,77815,138046}},
      {800000,{67801,78455,118191}},
      {900000,{69489,77882,114886}},
      {1000000,{67444,80079,118428}}]}}
4> seq_perf:test(array, 100000, 10). 
{2948361,
 {ok,[{100000,{105482,72841,108828}},
      {200000,{123655,78898,124092}},
      {300000,{110023,76130,106806}},
      {400000,{104126,73830,119640}},
      {500000,{104771,72593,110157}},
      {600000,{107306,72543,109713}},
      {700000,{122066,73340,110662}},
      {800000,{105853,72841,110618}},
      {900000,{105267,73090,106529}},
      {1000000,{103445,73206,109939}}]}}

【问题讨论】:

  • PersistentVector 实现中似乎有一些有用的技巧可以应用于 Erlang 数组模块,例如延迟尾部插入。
  • 确实如此。数组模块使用一些技巧来扩展具有“未定义”未设置索引的数组。它似乎还压缩了大片“未定义”元素。

标签: data-structures clojure erlang


【解决方案1】:

这些属性在纯功能实现中是不可能的。数组模块 (http://www.erlang.org/doc/man/array.html) 是一个很好的折衷方案,但如果您需要 O(1) 查找和更新,则必须改用 ETS 表.

【讨论】:

  • 我完全错过了这个模块。它似乎确实有 O(1) 用于更新和查找(或至少接近恒定)。正是我正在寻找的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 2012-04-10
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
相关资源
最近更新 更多