日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Erlang的散列数据结构

發(fā)布時(shí)間:2024/4/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Erlang的散列数据结构 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ?介紹Erlangdict模塊(?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)和鏈表的快速增減的,erlangdict模塊就提供了這種散列機(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-valuelang->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ò)appendappend_list來(lái)擴(kuò)展。

    最后還有幾個(gè)有用的函數(shù),fold,filter,map,update,用法和作用和以前介紹列表操作里面的一致。

    ? ? 好些文章和書(shū)籍都不推薦使用進(jìn)程字典,理由是破壞了erlangFP原則,還有些朋友曾經(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ò),歡迎將生活随笔推薦給好友。