生活随笔
收集整理的這篇文章主要介紹了
Erlang的散列数据结构
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ?介紹Erlang的dict模塊(?dictionary),dict就是一個通過散列(hash)來存放數據的組織方式,同時dict模塊還提供了完整的操作接口,類似的模塊還有orddict模塊。具體講如何使用dict模塊的各種常用方法之前,先來看一些基礎的概念。
? ?大家寫程序如果有一段時間了,發現程序中數組和鏈表是使用頻率很高的兩種數據結構,到底如何選擇全看實際應用,這里只給出數組和鏈表的一些基本特性的簡要說明:數組進行元素查找操作很快,但是增加刪除元素較慢;鏈表增加刪減元素很快,但是查找較慢,具體的原因根據它們的存貯結構就可以看出來了。下面引用一張來自《java數據結構和算法》中圖,可以給大家在選擇數據結構時一個很好的參考和指南:
?
?
散列結構同時兼備數組的快速查詢和鏈表的快速增減的,erlang的dict模塊就提供了這種散列機制,這里需要注意的是,Erlang的?dictionary和進程字典(process?dic)一樣,只在節點內的一個進程內使用的,而ets可以在多個進程中共享使用(當然你也可以把ets設定為不可以讓其他進程使用),下面開始看dict模塊具體使用。
建立一個字典,并存儲一對key-value,燃火根據key查詢值:
6>?D?=?dict:new().?{dict,0,16,16,8,80,48,???????{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},???????{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}?7>?D1?=?dict:store(lang,zh_cn,?D).?{dict,1,16,16,8,80,48,???????{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},???????{{[],[],[],[],[],[],[],?????????[[lang|zh_cn]],?????????[],[],[],[],[],[],[],[]}}}?8>?dict:fetch(lang,D1).????????????zh_cn? 現在字典D1中就已經存放了一對key-value:lang->zh_cn,這里有個重要的特性需要指出就是字典可以作為參數在函數間傳遞。Dict模塊的使用過程中,字典都是作為參數傳遞給函數,然乎返回一個新的字典,這其實就是Erlang?作為一種FP語言的一種特性---為了安全,保證變量不變。
接下來我們向字典中存貯一些更復雜的內容,比如存放一個列表:
17>?D2?=?dict:store(langs,[en,de],D1).?{dict,2,16,16,8,80,48,???????{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},???????{{[],[],[],?????????[[langs,en,de]],?????????[],[],[],?????????[[lang|zh_cn]],?????????[],[],[],[],[],[],[],[]}}}?18>?D3?=?dict:append(langs,jp,D2).?{dict,2,16,16,8,80,48,???????{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},???????{{[],[],[],?????????[[langs,en,de,jp]],?????????[],[],[],?????????[[lang|zh_cn]],?????????[],[],[],[],[],[],[],[]}}}?19>?D4?=?dict:append_list(langs,?[han,bz,af],?D3).?{dict,2,16,16,8,80,48,???????{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},???????{{[],[],[],?????????[[langs,en,de,jp,han,bz,af]],?????????[],[],[],?????????[[lang|zh_cn]],?????????[],[],[],[],[],[],[],[]}}}?20>?dict:fetch(langs,D4).?[en,de,jp,han,bz,af]?21>?dict:fetch(lang,D4).??zh_cn?22>?dict:find(langs,D4).??{ok,[en,de,jp,han,bz,af]}? 這里我們以langs這把key存貯一個由語言縮寫構成的列表,并在接下來多添加了一種語言,然后又一次性添加了多種語言,最后進行查詢測試。這些都很簡單,但是有一點需要注意的是,從字典中查詢key的值時,請使用find方法,查找成功返回{ok,?values}這個tuple,失敗返回?error,而fetch查找失敗直接就報錯了,如:
24>?dict:fetch(langss,D4).?**?exception?error:?bad?argument??????in?function??dict:fetch/2?????????called?as?dict:fetch(langss,??????????????????????????????{dict,2,16,16,8,80,48,????????????????????????????????????{[],[],[],[],[],[],[],[],[],[],[],[],[],[],?????????????????????????????????????[],[]},????????????????????????????????????{{[],[],[],??????????????????????????????????????[[langs,en,de,jp,han,bz,af]],??????????????????????????????????????[],[],[],??????????????????????????????????????[[lang|zh_cn]],??????????????????????????????????????[],[],[],[],[],[],[],[]}}})?25>?dict:find(langss,D4).??error? 統計字典里面存貯了多少key:
35>?dict:fetch_keys(D4).??[langs,lang]?36>?dict:size(D4).????????2? 通過一個tuple-lists結構快速構建一個字典:
27>?KV?=?[{name,["zhang"]},{fav,?"lol"},{location,"gz"}].?[{name,["zhang"]}},{fav,"lol"},{location,"gz"}]?29>?D?=?dict:from_list(KV).?{dict,3,16,16,8,80,48,???????{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},???????{{[],[],[],[],[],?????????[[name,108,117,111]],?????????[[fav,108,111,108]],?????????[],[],[],[],[],[],[],?????????[[location,103,122]],?????????[]}}}? ? ?這樣就初始化并且存放了值到一個字典,key-value結構和我們的KV結構一致,這里將name的值設定為一個列表,方便我們后期可以通過append和append_list來擴展。
最后還有幾個有用的函數,fold,filter,map,update,用法和作用和以前介紹列表操作里面的一致。
? ? 好些文章和書籍都不推薦使用進程字典,理由是破壞了erlang的FP原則,還有些朋友曾經和我說用了進程字典后,嚴重影響代碼的可讀性。我本人覺得該用還是得用,用的時候自己注意就好,畢竟這是Erlang里面速度最快的大數據結構了吧。如果對風格和安全要求很嚴格的話,又想兼顧散列這種優秀性能的話,那就使用dict模塊吧。
?
轉載于:https://blog.51cto.com/10lover10/1085470
總結
以上是生活随笔為你收集整理的Erlang的散列数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。