array
1. 效率:
其他語言的數組的優勢在於, 數組可以實現常量級的lookup和set。 而erlang 的array 的lookup和set 的效率在
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的