數(shù)據(jù)結(jié)構(gòu)之散列表

1.前言

以前看hashmap的原理看了很多次,過(guò)了很久都忘記了。真心發(fā)現(xiàn)以前的看書(shū)方法不對(duì)款筑。感覺(jué)學(xué)習(xí)還是要靠背書(shū)智蝠。這節(jié) 好好的踏實(shí)的把散列這屆記錄下。

2.正題

散列函數(shù):
將關(guān)鍵字(key) 映射成0--tablesize-1 這個(gè)范圍中的某一個(gè)數(shù)奈梳,然后放到適當(dāng)?shù)膯卧需就濉_@個(gè)映射就叫做“散列函數(shù)”。

沖突: 倆個(gè)或者多個(gè)關(guān)鍵字散列到同一個(gè)單元的時(shí)候攘须。就會(huì)產(chǎn)生沖突漆撞。

裝填因子:散列表的元素個(gè)數(shù) 比上 tablesize 得到的值,為裝填因子于宙。

通常對(duì)于key為String的 關(guān)鍵字來(lái)說(shuō)浮驳。一種方法就是將String 的每個(gè)字符,轉(zhuǎn)換成Ascll碼捞魁。然后累加至会。之后在%tablesize。(tablesize 不能為素?cái)?shù))谱俭。

還有一種散列函數(shù)沒(méi)搞明白奉件,就不記錄了。昆著。

介紹完了散列函數(shù)瓶蚂。那么就來(lái)寫(xiě)下 如何解決沖突問(wèn)題

1.分離鏈接法

image.png

在沖突的地方,加入一個(gè)單向鏈表宣吱。如何待插入的數(shù)據(jù)是一個(gè)新數(shù)據(jù)的時(shí)候窃这,那么它將被插入鏈表的前端。不僅因?yàn)榉矫嬲骱颉8且驗(yàn)樽钚虏迦氲臄?shù)據(jù)最有可能被用到杭攻。

當(dāng)進(jìn)行插入的時(shí)候。發(fā)現(xiàn)鏈表中有之前的一摸一樣的key疤坝。那么就會(huì)替換掉oldValue:

image.png

兆解。

問(wèn)題1:hashmap為什么是無(wú)序的?
因?yàn)樗峭ㄟ^(guò)散列函數(shù)跑揉,映射得到數(shù)組的下標(biāo)的锅睛。所以是無(wú)序的。

問(wèn)題2:hashmap在多線程的情況下历谍,是不安全的
hashmap 的源碼是沒(méi)有假如任何的鎖機(jī)制现拒。多線程的情況下。假設(shè)新插入的元素都是無(wú)重復(fù)的望侈。那么在多線程的情況下印蔬,最后一個(gè)線程插入的數(shù)據(jù),會(huì)覆蓋之前插入的數(shù)據(jù)脱衙。所以鏈表的第一個(gè)數(shù)組侥猬,是最后一個(gè)線程的數(shù)例驹。

缺點(diǎn):由于給新單元分配地址需要時(shí)間,導(dǎo)致算法速度有些慢退唠。

2.線程探測(cè)法
探測(cè)性散列表的table 要大于 分離鏈接法鹃锈。一般來(lái)說(shuō) 探測(cè)性散列表的裝填因子<0.5。

線性探測(cè)法:以增量序列1瞧预,2屎债,......,(TableSize-1)循環(huán)試探下一個(gè)存儲(chǔ)地址

image.png

一次聚集現(xiàn)象:如上圖的表插入30 之后松蒜。明顯右邊的數(shù)據(jù)要密集些。左邊的數(shù)據(jù)要稀疏一點(diǎn)已旧。這樣的現(xiàn)象就叫做 聚集現(xiàn)象秸苗。

缺點(diǎn): 當(dāng)表很大的時(shí)候,出現(xiàn)聚集情況运褪,會(huì)導(dǎo)致新插入的數(shù)據(jù)要和每個(gè)單元進(jìn)行比較惊楼。插入不成功的情況大大增多。

3.平方探測(cè)法
針對(duì)線性探測(cè)法的缺點(diǎn)秸讹,偉大的算法工程師檀咙,又想出了 平方探測(cè)法,來(lái)解決線性探測(cè)法的聚集現(xiàn)象璃诀。

缺點(diǎn):產(chǎn)生二次聚集弧可。

3.LinkHashMap
LinkedHashMap采用的hash算法和HashMap相同,但是它重新定義了數(shù)組中保存的元素Entry劣欢,該Entry除了保存當(dāng)前對(duì)象的引用外棕诵,還保存了其上一個(gè)元素before和下一個(gè)元素after的引用,從而在哈希表的基礎(chǔ)上又構(gòu)成了雙向鏈接列表凿将。參考http://wiki.jikexueyuan.com/project/java-collection/linkedhashmap.html

LinkHashMap 鏈表部分 采用了雙向鏈表校套。保證了插入順序和訪問(wèn)順序。

插入順序

image.png

訪問(wèn)順序

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牧抵,一起剝皮案震驚了整個(gè)濱河市笛匙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌犀变,老刑警劉巖妹孙,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件室埋,死亡現(xiàn)場(chǎng)離奇詭異睦授,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)皿哨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)映琳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)机隙,“玉大人蜘拉,你說(shuō)我怎么就攤上這事∮新梗” “怎么了旭旭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)葱跋。 經(jīng)常有香客問(wèn)我持寄,道長(zhǎng),這世上最難降的妖魔是什么娱俺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任稍味,我火速辦了婚禮,結(jié)果婚禮上荠卷,老公的妹妹穿的比我還像新娘模庐。我一直安慰自己,他們只是感情好油宜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布掂碱。 她就那樣靜靜地躺著,像睡著了一般慎冤。 火紅的嫁衣襯著肌膚如雪疼燥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天蚁堤,我揣著相機(jī)與錄音醉者,去河邊找鬼。 笑死披诗,一個(gè)胖子當(dāng)著我的面吹牛湃交,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藤巢,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼搞莺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了掂咒?” 一聲冷哼從身側(cè)響起才沧,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绍刮,沒(méi)想到半個(gè)月后温圆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孩革,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年岁歉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膝蜈。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锅移,死狀恐怖熔掺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情非剃,我是刑警寧澤置逻,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站备绽,受9級(jí)特大地震影響券坞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肺素,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一恨锚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倍靡,春花似錦猴伶、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)布卡。三九已至雨让,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忿等,已是汗流浹背栖忠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贸街,地道東北人庵寞。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像薛匪,于是被迫代替她去往敵國(guó)和親捐川。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容