erlang 數據機構 -- array

array

1. 效率:

其他語言的數組的優勢在於, 數組可以實現常量級的lookup和set。 而erlang 的array 的lookup和set 的效率在logxY (X = 10, Y = size) 數量級。

2. 實現:

先做個黑盒實驗

1> A = array:new(10).
{array,10,0,undefined,10}
2> A1 = array:set(1, a, A).
{array,10,0,undefined,
       {undefined,a,undefined,undefined,undefined,undefined,
                  undefined,undefined,undefined,undefined}}
3> A2 = array:resize(1000, A1).
{array,1000,0,undefined,
       {{{undefined,a,undefined,undefined,undefined,undefined,
                    undefined,undefined,undefined,undefined},
         10,10,10,10,10,10,10,10,10,10},
        100,100,100,100,100,100,100,100,100,100}}
4> A3 = array:set(401, b, A2).
{array,1000,0,undefined,
       {{{undefined,a,undefined,undefined,undefined,undefined,
                    undefined,undefined,undefined,undefined},
         10,10,10,10,10,10,10,10,10,10},
        100,100,100,
        {{undefined,b,undefined,undefined,undefined,undefined,
                    undefined,undefined,undefined,undefined},
         10,10,10,10,10,10,10,10,10,10},
        100,100,100,100,100,100}}

可以看到array的實現是以
* 最小級的node爲一個大小爲10的tuple, 如果在這個node裏面沒有值就不擴展,有的話就擴展成一個10 的tuple,
* 其他級別的node裏面記錄11個值, 最後一個值爲此級別分塊的大小 。
看下源碼, get, set 的實現差不多,以下是erlang 實現set

-define(NODEPATTERN(S), {_,_,_,_,_,_,_,_,_,_,S}). % NODESIZE(10)+1 elements
set_1(I, E=?NODEPATTERN(S), X, D) ->
    I1 = I div S + 1,
    setelement(I1, E, set_1(I rem S, element(I1, E), X, D));
set_1(I, E, X, D) when is_integer(E) ->
    expand(I, E, X, D);
set_1(I, E, X, _D) ->
    setelement(I+1, E, X)

可以看出如果想要在一個10000 的數組中得到index = 5 的值, 則需要3次 div 和 rem。

3. 使用場景:

幾乎很少看到使用array模塊。 感覺定位有點模糊, 如果想要完成矩陣等的計算, 一般也是通過port,讓其他語言來實現。引用:地址

4. 注意:

array的索引是基於0的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章