散列表

散列表是一種基本的數(shù)據(jù)結(jié)構(gòu),那么散列表到底是什么樣的一種數(shù)據(jù)結(jié)構(gòu)呢?又有哪些應(yīng)用場景呢宽气?

假如我們要從一本電話本中查找一個人的電話號碼

如果這個電話本不是有序的,那我們每一行去找O(n)

如果是排列有序的潜沦,那我們可以通過二分查找O(logn)

需要注意的是O(n)O(logn)的運行時間有著天壤之別萄涯,假設(shè)每秒能查找10行,在我們使用簡單查找O(n)與二分查找O(logn)耗時如下表:

如圖二分查找效率已經(jīng)高出很多唆鸡,但是還要去掃描多行涝影,那有沒有更高效、常數(shù)級O(1)的查找呢喇闸??這就是散列表的用武之地袄琳。

散列函數(shù)

? ? 我通俗解釋為,把輸入映射(轉(zhuǎn)換)到數(shù)字燃乍,并滿足一些條件:

必須是一致的唆樊,相同的輸入必須轉(zhuǎn)換到相同的數(shù)字,例如輸入”張三”時得到的是0刻蟹,那么每次輸入”張三”得到的數(shù)值都必須是0逗旁。

將不同的輸入映射成不同的數(shù)字,最為理想的情況下將不同的輸入映射到不同的數(shù)字舆瘪。

散列函數(shù)又有何用處呢片效?

如上圖,散列函數(shù)準(zhǔn)確的指出了”張三”的存儲位置英古,根本不用查找淀衣,因為:

散列函數(shù)將同樣的輸入映射到了相同的索引。

散列函數(shù)將不同的輸入映射到了不同的索引召调。

散列函數(shù)數(shù)組內(nèi)的有效索引(沒有超過數(shù)組的邊界)膨桥。

沖突

? ? 前面我們假設(shè)的散列函數(shù)總是能將不同的輸入映射到了數(shù)組的不同位置蛮浑。而實際上,幾乎不可能編寫出這樣的散列函數(shù)只嚣。

不同的輸入被分配到了同一個數(shù)組位置上了沮稚,這就是沖突。所以只能在這個索引位置上存儲一個鏈表册舞。

如上圖蕴掏,如果散列表除第3個位置上有存儲了一個列表,其它位置上都是空的调鲸,換而言之就是說盛杰,這個散列表中的所有元素都在這個鏈表上。那性能會很糟糕O(n)藐石。

所以饶唤,散列函數(shù)非常非常重要。

(有興趣的朋友可以研究一下MurmurHash贯钩,https://en.wikipedia.org/wiki/MurmurHash)

一般常見語言都實現(xiàn)了散列表,如Java的HashMap


Go中的map

Python的字典

引伸一下應(yīng)用办素,如Redis中字典的實現(xiàn):

https://sourcegraph.com/github.com/antirez/redis@fe43406929dbf6e6316f53f891370850cd8e1c3f/-/blob/src/dict.h#L77

dictEntry:哈希表數(shù)組

size:哈希表大小

sizemask:散列表大小的掩碼角雷,用于計算索引值

used:使用節(jié)點的數(shù)量

key:鍵值中的鍵

v:鍵值中的值

next:下一下散列節(jié)點的指針(解決散列函數(shù)的碰撞問題)

Resize 散列表擴容

可以自行參考一下Redis的rehash與漸進式rehash,本文主要介紹一下散列表這種數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)性穿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勺三,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子需曾,更是在濱河造成了極大的恐慌吗坚,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呆万,死亡現(xiàn)場離奇詭異商源,居然都是意外死亡,警方通過查閱死者的電腦和手機谋减,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門牡彻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人出爹,你說我怎么就攤上這事庄吼。” “怎么了严就?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵总寻,是天一觀的道長。 經(jīng)常有香客問我梢为,道長渐行,這世上最難降的妖魔是什么轰坊? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮殊轴,結(jié)果婚禮上衰倦,老公的妹妹穿的比我還像新娘。我一直安慰自己旁理,他們只是感情好樊零,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著孽文,像睡著了一般驻襟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芋哭,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天沉衣,我揣著相機與錄音,去河邊找鬼减牺。 笑死豌习,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拔疚。 我是一名探鬼主播肥隆,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稚失!你這毒婦竟也來了栋艳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤句各,失蹤者是張志新(化名)和其女友劉穎吸占,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凿宾,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡矾屯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了初厚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片问拘。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惧所,靈堂內(nèi)的尸體忽然破棺而出骤坐,到底是詐尸還是另有隱情,我是刑警寧澤下愈,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布纽绍,位于F島的核電站,受9級特大地震影響势似,放射性物質(zhì)發(fā)生泄漏拌夏。R本人自食惡果不足惜僧著,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望障簿。 院中可真熱鬧盹愚,春花似錦、人聲如沸站故。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽西篓。三九已至愈腾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岂津,已是汗流浹背虱黄。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吮成,地道東北人橱乱。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像粱甫,于是被迫代替她去往敵國和親仅醇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

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