生活随笔
收集整理的這篇文章主要介紹了
Erlang的散列数据结构
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? ?介紹Erlang的dict模塊(?dictionary),dict就是一個(gè)通過(guò)散列(hash)來(lái)存放數(shù)據(jù)的組織方式,同時(shí)dict模塊還提供了完整的操作接口,類(lèi)似的模塊還有orddict模塊。具體講如何使用dict模塊的各種常用方法之前,先來(lái)看一些基礎(chǔ)的概念。
? ?大家寫(xiě)程序如果有一段時(shí)間了,發(fā)現(xiàn)程序中數(shù)組和鏈表是使用頻率很高的兩種數(shù)據(jù)結(jié)構(gòu),到底如何選擇全看實(shí)際應(yīng)用,這里只給出數(shù)組和鏈表的一些基本特性的簡(jiǎn)要說(shuō)明:數(shù)組進(jìn)行元素查找操作很快,但是增加刪除元素較慢;鏈表增加刪減元素很快,但是查找較慢,具體的原因根據(jù)它們的存貯結(jié)構(gòu)就可以看出來(lái)了。下面引用一張來(lái)自《java數(shù)據(jù)結(jié)構(gòu)和算法》中圖,可以給大家在選擇數(shù)據(jù)結(jié)構(gòu)時(shí)一個(gè)很好的參考和指南:
?
?
散列結(jié)構(gòu)同時(shí)兼?zhèn)鋽?shù)組的快速查詢(xún)和鏈表的快速增減的,erlang的dict模塊就提供了這種散列機(jī)制,這里需要注意的是,Erlang的?dictionary和進(jìn)程字典(process?dic)一樣,只在節(jié)點(diǎn)內(nèi)的一個(gè)進(jìn)程內(nèi)使用的,而ets可以在多個(gè)進(jìn)程中共享使用(當(dāng)然你也可以把ets設(shè)定為不可以讓其他進(jìn)程使用),下面開(kāi)始看dict模塊具體使用。
建立一個(gè)字典,并存儲(chǔ)一對(duì)key-value,燃火根據(jù)key查詢(xún)值:
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? 現(xiàn)在字典D1中就已經(jīng)存放了一對(duì)key-value:lang->zh_cn,這里有個(gè)重要的特性需要指出就是字典可以作為參數(shù)在函數(shù)間傳遞。Dict模塊的使用過(guò)程中,字典都是作為參數(shù)傳遞給函數(shù),然乎返回一個(gè)新的字典,這其實(shí)就是Erlang?作為一種FP語(yǔ)言的一種特性---為了安全,保證變量不變。
接下來(lái)我們向字典中存貯一些更復(fù)雜的內(nèi)容,比如存放一個(gè)列表:
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存貯一個(gè)由語(yǔ)言縮寫(xiě)構(gòu)成的列表,并在接下來(lái)多添加了一種語(yǔ)言,然后又一次性添加了多種語(yǔ)言,最后進(jìn)行查詢(xún)測(cè)試。這些都很簡(jiǎn)單,但是有一點(diǎn)需要注意的是,從字典中查詢(xún)key的值時(shí),請(qǐng)使用find方法,查找成功返回{ok,?values}這個(gè)tuple,失敗返回?error,而fetch查找失敗直接就報(bào)錯(cuò)了,如:
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? 統(tǒng)計(jì)字典里面存貯了多少key:
35>?dict:fetch_keys(D4).??[langs,lang]?36>?dict:size(D4).????????2? 通過(guò)一個(gè)tuple-lists結(jié)構(gòu)快速構(gòu)建一個(gè)字典:
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]],?????????[]}}}? ? ?這樣就初始化并且存放了值到一個(gè)字典,key-value結(jié)構(gòu)和我們的KV結(jié)構(gòu)一致,這里將name的值設(shè)定為一個(gè)列表,方便我們后期可以通過(guò)append和append_list來(lái)擴(kuò)展。
最后還有幾個(gè)有用的函數(shù),fold,filter,map,update,用法和作用和以前介紹列表操作里面的一致。
? ? 好些文章和書(shū)籍都不推薦使用進(jìn)程字典,理由是破壞了erlang的FP原則,還有些朋友曾經(jīng)和我說(shuō)用了進(jìn)程字典后,嚴(yán)重影響代碼的可讀性。我本人覺(jué)得該用還是得用,用的時(shí)候自己注意就好,畢竟這是Erlang里面速度最快的大數(shù)據(jù)結(jié)構(gòu)了吧。如果對(duì)風(fēng)格和安全要求很?chē)?yán)格的話(huà),又想兼顧散列這種優(yōu)秀性能的話(huà),那就使用dict模塊吧。
?
轉(zhuǎn)載于:https://blog.51cto.com/10lover10/1085470
總結(jié)
以上是生活随笔為你收集整理的Erlang的散列数据结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。