2015-05-12 81 views

回答

20

是的,其中大多數是持久性數據結構。

例如,藥劑名單鏈表和鏈表是退化樹(它只有一個分支):

Elixir: list = [1, 2, 3, 4] 
Tree: 1 -> 2 -> 3 -> 4 

你前面加上一個元素到列表時,它都會將分享其尾巴:

Elixir: [0|list] 
Tree: 0 -> (1 -> 2 -> 3 -> 4) 

藥劑的HashSet的和HashDict實現是基於Clojure的持久數據結構,並有效地樹木。 There is some write up on Joseph's blog

地圖也是持久的數據結構,它們非常有趣,因爲它們的表示根據鍵的數量而變化。當你有小地圖,讓我們說:

%{:foo => 1, :bar => 2, :baz => 3} 

,因爲它是表示:

 -------------(:foo, :bar, :baz) 
     | 
(map, keys, values) 
       | 
       ------(1, 2, 3) 

所以每次更新一個關鍵,我們分享的「鑰匙」水桶和只改變值桶。這對於小地圖來說非常有效,但是一旦你得到約20個關鍵字,在Erlang 18中,他們將其表示更改爲基於Hash Array Mapped Tries,這與Clojure類似。

注意元組雖然不是持久的(它們表示內存中的連續空間)。一旦更改了元組中的一個元素,就會創建一個全新的元組。這使得它們對於保存和訪問少量元素以及對其進行模式匹配非常有用,但您絕對不想擁有許多元素。

+0

謝謝!所以主要的區別是沒有持久的向量/元組。是否有關於elixir列表的屬性的書寫?計數O(1)?追加結束? –

+0

在這裏找到答案,長度爲O(n),追加到結尾也是O(n)。任何計劃實施永久載體? –

+2

目前你有兩種選擇:使用Erlang的「數組」模塊或使用地圖作爲矢量(鍵是數字)。如果你想做非常特定的矢量操作,第二個選項是不夠的。我們已經討論過添加矢量,但它目前還不在路線圖中。 –

相關問題