散列表(Hash Table)

定義

散列表是一種以平均O(1)時間插入跋涣、刪除和查找的數(shù)據(jù)結(jié)構(gòu)许师,可是類似于findMax,findMin等操作則需要以O(shè)(N)的時間才能完成

散列函數(shù)

散列函數(shù)是將關(guān)鍵字計算成Hash值的一個函數(shù)
散列函數(shù)的選擇是非常重要的,它的復(fù)雜度影響著影響著插入、刪除宙址、查找的速度:

  1. 散列值的計算時間
    • 每次操作前需要根據(jù)關(guān)鍵字進行散列,尋找關(guān)鍵字存儲位置
  2. 散列值的重合度
    • 根據(jù)散列沖突(Hash Conflict)的解決方案调卑,從沖突的存儲數(shù)據(jù)中找到真正的數(shù)據(jù)位置

解決Hash沖突

方案1:分離鏈接法

將關(guān)鍵字的Hash值相同的節(jié)點以鏈表的方式進行存儲抡砂,以解決Hash沖突

新插入的節(jié)點都會放在第一個,因為往往新插入的節(jié)點元素最有可能被訪問恬涧,所以插入效率很高注益。
而當(dāng)需要刪除/查找節(jié)點的時候,如果散列函數(shù)的計算出來的值重合度非常高溯捆,那么最壞的情況會將O(1)的常數(shù)時間變成O(N)的線性時間丑搔,因為需要把整個鏈表進行遍歷。也可以用變種的二叉樹進行存儲,也只是將O(N)的時間變成了O(logN)而已低匙。

所以散列函數(shù)的選擇是非常非常重要的,盡量對關(guān)鍵字所計算的時間要短碳锈,并且重合度低才能保證Hash的效率

分離鏈接法

方案2:開放尋址法-線性探測

根據(jù)關(guān)鍵字散列后顽冶,找到關(guān)鍵字散列位置,查找散列表中離沖突單元最近的空閑單元售碳,并且把新的鍵插入這個空閑單元强重。當(dāng)插入節(jié)點滿了的話,則需要進行擴容贸人。
如下圖:
John Smith和Sandra Dee(都被雜湊映射到了單元873)的沖突间景,借由把后者放在下一個空閑單元(單元874)而解決


線性探測法

當(dāng)查找節(jié)點的時候,找到Hash位置艺智,然后一個個往下找倘要,直到找到節(jié)點或者空節(jié)點才返回。

當(dāng)刪除節(jié)點的時候十拣,單純地清空對應(yīng)的單元是不夠的封拧。這會影響到對于儲存時間早于該單元、但儲存位置在該單元之后的其他鍵夭问,從而對查找產(chǎn)生影響泽西。
相較于直接清空對應(yīng)單元i,更好的做法是先清空缰趋,然后把它之后所有會造成問題的單元向前移動捧杉,來避免搜索出錯。重復(fù)直到出現(xiàn)空單元秘血,則刪除動作安全完成味抖。如下圖:


當(dāng)一對鍵值對被刪除,可能會有必要將其他的鍵值對放回到它的單元中灰粮,來防止搜索時搜索到空的單元

方案3:開放尋址法-平方探測

與線性探測差不多非竿,只是插入的間隔從1變成了沖突間隔的平方,如A與B沖突了谋竖,而C與AB都沖突了红柱,那么C就會插入到距離A的2*2的空閑位置處。

荷載因子

散列表的載荷因子定義為:A = 填入表中的元素個數(shù) / 散列表的長度

A越大蓖乘,表明填入表中的元素越多锤悄,產(chǎn)生沖突的可能性就越大,A越小嘉抒,標(biāo)明填入表中的元素越少零聚,產(chǎn)生沖突的可能性就越小

對于開放定址法,荷載因子是特別重要因素,應(yīng)嚴格限制在0.7-0.8以下隶症。超過0.8政模,查表時的CPU緩存不命中(cache missing)按照指數(shù)曲線上升。因此蚂会,一些采用開放定址法的hash庫淋样,如Java的系統(tǒng)庫限制了荷載因子為0.75,超過此值將resize散列表

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胁住,一起剝皮案震驚了整個濱河市趁猴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彪见,老刑警劉巖儡司,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異余指,居然都是意外死亡捕犬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門酵镜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來或听,“玉大人,你說我怎么就攤上這事笋婿∮桑” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵缸濒,是天一觀的道長足丢。 經(jīng)常有香客問我,道長庇配,這世上最難降的妖魔是什么斩跌? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮捞慌,結(jié)果婚禮上耀鸦,老公的妹妹穿的比我還像新娘。我一直安慰自己啸澡,他們只是感情好袖订,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嗅虏,像睡著了一般洛姑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上皮服,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天楞艾,我揣著相機與錄音参咙,去河邊找鬼。 笑死硫眯,一個胖子當(dāng)著我的面吹牛蕴侧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播两入,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼净宵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谆刨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤归斤,失蹤者是張志新(化名)和其女友劉穎痊夭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脏里,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡她我,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迫横。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片番舆。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矾踱,靈堂內(nèi)的尸體忽然破棺而出恨狈,到底是詐尸還是另有隱情,我是刑警寧澤呛讲,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布禾怠,位于F島的核電站,受9級特大地震影響贝搁,放射性物質(zhì)發(fā)生泄漏吗氏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一雷逆、第九天 我趴在偏房一處隱蔽的房頂上張望弦讽。 院中可真熱鬧,春花似錦膀哲、人聲如沸往产。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捂齐。三九已至,卻和暖如春缩抡,著一層夾襖步出監(jiān)牢的瞬間奠宜,已是汗流浹背包颁。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留压真,地道東北人娩嚼。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像滴肿,于是被迫代替她去往敵國和親岳悟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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

  • 散列表(Hash table)——將條目的關(guān)鍵碼視作其在映射結(jié)構(gòu)中的存放位置 散列表由兩個要素構(gòu)成:桶數(shù)組與散列函...
    峰峰小閱讀 2,216評論 0 3
  • 一泼差、散列的概念 散列方法的主要思想是根據(jù)結(jié)點的關(guān)鍵碼值來確定其存儲地址:以關(guān)鍵碼值K為自變量贵少,通過一定的函數(shù)關(guān)系h...
    SeanMa閱讀 64,091評論 1 30
  • 什么是哈希表? 哈希表(Hash table堆缘,也叫散列表)滔灶,是根據(jù)關(guān)鍵碼值(Key value)而直接進行訪問的數(shù)...
    郝程序猿閱讀 2,237評論 1 7
  • 一、相關(guān)定義 查找——查找就是根據(jù)給定的某個值吼肥,在查找表中確定一個其關(guān)鍵字等于給定值的數(shù)據(jù)元素(或記錄)录平。所有這些...
    開心糖果的夏天閱讀 1,128評論 0 8
  • 落葉空山,揀盡寒枝缀皱。 寂寥午后斗这,想與你攜手同行, 看楊柳三千啤斗,看櫻花遍山表箭。 看落霞孤鶩,不如你在我身邊钮莲。 長亭古道...
    白雪媚火閱讀 395評論 1 5