Elixir中的所有不可變數據結構是否持久?如果不是,它們是哪一個,哪一個不是?另外,它們如何與Clojure中的持久數據結構進行比較?Elixir是否具有類似於Clojure的持久數據結構?
回答
是的,其中大多數是持久性數據結構。
例如,藥劑名單鏈表和鏈表是退化樹(它只有一個分支):
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類似。
注意元組雖然不是持久的(它們表示內存中的連續空間)。一旦更改了元組中的一個元素,就會創建一個全新的元組。這使得它們對於保存和訪問少量元素以及對其進行模式匹配非常有用,但您絕對不想擁有許多元素。
謝謝!所以主要的區別是沒有持久的向量/元組。是否有關於elixir列表的屬性的書寫?計數O(1)?追加結束? –
在這裏找到答案,長度爲O(n),追加到結尾也是O(n)。任何計劃實施永久載體? –
目前你有兩種選擇:使用Erlang的「數組」模塊或使用地圖作爲矢量(鍵是數字)。如果你想做非常特定的矢量操作,第二個選項是不夠的。我們已經討論過添加矢量,但它目前還不在路線圖中。 –
- 1. 是否有雙向multimap持久數據結構?
- 2. 使數據結構持久
- 3. Erlang持久數據結構
- 4. Java是否具有支持併發修改的數據結構?
- 5. 在Java中完成類型化的持久數據結構a Clojure?
- 6. 這是否類似隊列數據結構有名字嗎?
- 7. Redis是否具有選定鍵/數據的持久性功能?
- 8. 是否有任何HyperLogLog類似於多個multisets的結構?
- 9. 是否有基於範圍的類似案例控制結構
- 10. 模型類似於關係數據庫的類還是結構?
- 11. 類似文件系統的數據結構的快速和持久表示
- 12. Java中的持久數據結構
- 13. Scala中的持久數據結構
- 14. 通用類型,所有權和持久數據結構
- 15. Ruby中有沒有類似於Pascal記錄的數據結構?
- 16. 是否有類似「數據庫」對象的標準數據結構?
- 17. 是否有類似於Callable但具有參數的接口?
- 18. 在Java中創建類似於數據結構的結構
- 19. 搜索具有類似性質的數據在結構
- 20. IE是否支持indexedDB,WebSQL或類似於SQLite的數據庫?
- 21. 持久與不可變數據結構
- 22. iOS非持久性數據結構
- 23. 持久性隊列數據結構
- 24. 數據結構:類似於樹的圖 - 但不是樹
- 25. 是否有一個具有類似git特質的數據庫?
- 26. 將數組存儲在c#數據結構中,使其具有類似於數值結構的行爲
- 27. 是否有elixir枚舉或任何其他模塊具有group_by函數類似於ruby的group_by
- 28. 類似Clojure的方式在一個循環中有一個數據結構
- 29. Clojure數據結構函數
- 30. clojure中是否有類似「andmap」的函數?
你的意思是這樣的吧? http://hypirion.com/musings/understanding-persistent-vector-pt-1 – GavinBrelstaff