數(shù)據(jù)結(jié)構(gòu):Hash Table

一、基本概念
哈希表(hash table)是一種根據(jù)關(guān)鍵字直接訪問內(nèi)存存儲位置的數(shù)據(jù)結(jié)構(gòu),通過哈希表,數(shù)據(jù)元素的存放位置和數(shù)據(jù)元素的關(guān)鍵字之間建立起某種對應(yīng)關(guān)系,建立這種對應(yīng)關(guān)系的函數(shù)稱為哈希函數(shù)。

哈希表

二、哈希表的構(gòu)造方法
假設(shè)要存儲的數(shù)據(jù)元素個(gè)數(shù)是n,設(shè)置一個(gè)長度為m(m > n)的連續(xù)存儲單元,分別以每個(gè)數(shù)據(jù)元素的關(guān)鍵字Ki(0<=i<=n-1)為自變量,通過哈希函數(shù)hash(Ki),把Ki映射為內(nèi)存單元的某個(gè)地址hash(Ki),并將數(shù)據(jù)元素存儲在內(nèi)存單元中。
從數(shù)學(xué)的角度看,哈希函數(shù)實(shí)際上是關(guān)鍵字到內(nèi)存單元的映射,因此我們希望通過哈希函數(shù)通過盡量簡單的運(yùn)算使得哈希函數(shù)計(jì)算出的哈希地址盡量均勻的被映射到一系列的內(nèi)存單元中,構(gòu)造哈希函數(shù)有三個(gè)要點(diǎn):(1)運(yùn)算過程要盡量簡單高效,以提高哈希表的插入和檢索效率;(2)哈希函數(shù)應(yīng)該具有較好的散列型,以降低哈希沖突的概率;第三,哈希函數(shù)應(yīng)具有較大的壓縮性,以節(jié)省內(nèi)存。
(1)直接地址法:以關(guān)鍵字的某個(gè)線性函數(shù)值為哈希地址,可以表示為hash(K)=aK+C;優(yōu)點(diǎn)是不會產(chǎn)生沖突,缺點(diǎn)是空間復(fù)雜度可能會較高,適用于元素較少的情況
(2)除留余數(shù)法:它是由數(shù)據(jù)元素關(guān)鍵字除以某個(gè)常數(shù)所留的余數(shù)為哈希地址,該方法計(jì)算簡單,適用范圍廣,是經(jīng)常使用的一種哈希函數(shù),可以表示為:
hash(K=K mod C)該方法的關(guān)鍵是常數(shù)的選取,一般要求是接近或等于哈希表本身的長度,研究理論表明,該常數(shù)選素?cái)?shù)時(shí)效果最好
(3)數(shù)字分析法:該方法是取數(shù)據(jù)元素關(guān)鍵字中某些取值較均勻的數(shù)字來作為哈希地址的方法,這樣可以盡量避免沖突,但是該方法只適合于所有關(guān)鍵字已知的情況,對于想要設(shè)計(jì)出更加通用的哈希表并不適用
三、哈希沖突的解決方案
在構(gòu)造哈希表時(shí),存在這樣的問題:對于兩個(gè)不同的關(guān)鍵字,通過我們的哈希函數(shù)計(jì)算哈希地址時(shí)卻得到了相同的哈希地址,我們將這種現(xiàn)象稱為哈希沖突
哈希沖突

哈希沖突主要與兩個(gè)因素有關(guān)
(1)填裝因子,填裝因子是指哈希表中已存入的數(shù)據(jù)元素個(gè)數(shù)與哈希地址空間的大小的比值,a=n/m ; a越小,沖突的可能性就越小,相反則沖突可能性較大;但是a越小空間利用率也就越小,a越大,空間利用率越高,為了兼顧哈希沖突和存儲空間利用率,通常將a控制在0.6-0.9之間,而.net中的HashTable則直接將a的最大值定義為0.72 (雖然微軟官方MSDN中聲明HashTable默認(rèn)填裝因子為1.0,但實(shí)際上都是0.72的倍數(shù))
(2)與所用的哈希函數(shù)有關(guān),如果哈希函數(shù)得當(dāng),就可以使哈希地址盡可能的均勻分布在哈希地址空間上,從而減少?zèng)_突的產(chǎn)生,但一個(gè)良好的哈希函數(shù)的得來很大程度上取決于大量的實(shí)踐。
哈希沖突通常是很難避免的,解決哈希沖突有很多種方法,通常分為兩大類:
1.開放地址法:他是一類以發(fā)生哈希沖突的哈希地址為自變量,通過某種哈希函數(shù)得到一個(gè)新的空閑內(nèi)存單元地址的方法,開放地址法的哈希沖突函數(shù)通常是一組
image.png

2.鏈表法:當(dāng)未發(fā)生沖突時(shí),直接存放數(shù)據(jù),當(dāng)沖突產(chǎn)生時(shí),把產(chǎn)生沖突的數(shù)據(jù)元素另外存放在單鏈表中
image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 基本概念 散列表查找(K -- V)。存儲位置 = f(關(guān)鍵字) 查找的時(shí)候根據(jù)key的映射f(key)找到值存儲...
    erU閱讀 364評論 0 1
  • 散列表,它是基于快速存取的角度設(shè)計(jì)的,也是一種典型的“空間換時(shí)間”的做法。顧名思義,該數(shù)據(jù)結(jié)構(gòu)可以理解為一個(gè)線性表...
    yeying12321閱讀 3,707評論 0 6
  • 最近在復(fù)習(xí)算法和數(shù)據(jù)結(jié)構(gòu) ,這章把hash表的概念和相關(guān)題目進(jìn)行匯總。 一、前言 1.1、哈希表和數(shù)組...
    泥孩兒0107閱讀 1,418評論 0 1
  • 我承認(rèn)開始是同情,最后確實(shí)真感情,可能她不信,我只是不甘心,你只要稍微挽留一下我就留下了,可是你沒有,給了我想要的...
    青衫北月閱讀 258評論 0 0
  • 在職業(yè)院校三年了,三年里,大部分時(shí)間活得渾渾噩噩。聽很多人問我“你沒有去高中?”,“不會吧,我還一直以為你在高中呢...
    清歌巷閱讀 213評論 2 0