是否有一个模块在Erlang中实现了一个有效的数组类型?

dsm*_*ith 6 erlang clojure data-structures

我一直在寻找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)
Run Code Online (Sandbox Code Playgroud)

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

erlang:append_element/2          O(N).
erlang:setelement/3              O(N).
Run Code Online (Sandbox Code Playgroud)

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

编辑:

对于那些感兴趣的人,我已经使用与clojure.lang.PersistentVector相同的算法完成了vector.erl的实现.它具有与阵列模块类似的性能特征,但在附加上具有略微更好的常数因子.

以下测试每个间隔附加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}}]}}
Run Code Online (Sandbox Code Playgroud)

Ric*_*rdC 8

在纯功能实现中,这些属性是不可能的.阵列模块(http://www.erlang.org/doc/man/array.html)是一个相当不错的折衷方案,但是如果你需要O(1)查找和更新,你将不得不使用ETS表来代替.