散列表/哈希表

0.散列表的定義

<0>定義:根絕鍵(Key)而直接訪問內(nèi)存位置的數(shù)據(jù)結構炭分。也就是說,它通過計算一個關于鍵值的函數(shù)霍比,將所需要查詢的數(shù)據(jù)映射到表中的一個位置來訪問記錄擂红,加快了查找速度。這個映射函數(shù)稱作散列函數(shù)祝谚,存放記錄的數(shù)組稱作散列表宪迟。

<1>一些基本的概念

(1):若關鍵字為k,則其值存放在f(k)的存儲位置上交惯。由此次泽,不需要比較便可以直接取得所查的記錄。成哥這對應關系f為散列函數(shù)席爽,建立的表為散列表箕憾。

(2):對不同關鍵子可能得到同意散列地址,即k1 != k2, 但是f(k1) == f(k2)拳昌,這種現(xiàn)象稱為沖突袭异。

(3):若對于關鍵字集合中的任意一個關鍵字,經(jīng)散列函數(shù)映射到地址集合中任何一個地址的概率是相等的炬藤,則稱此類散列函數(shù)為均勻散列函數(shù)御铃,這使得關鍵字經(jīng)過散列函數(shù)得到的是一個“隨機的地址”碴里,從而減少了沖突。

1.散列表的抽象數(shù)據(jù)類型

類型名稱:符號表(SymbolTable)

數(shù)據(jù)對象集:符號表是"名字(Name)-屬性(Attribute)"對的集合

操作集:

Table\in SybolTable, Name\in NameType, Attr\in AttributeType

1.SymbolTable InitializeTable(int TableSize);創(chuàng)建一個長度為TableSize的符號表

2.bool IsIn(SymbolTable Table, NameType Name);查找特定名字Name是否在符號表Table中

3.AttributeType Find(SymbolTable Table, NameType Name);獲取Table中指定名字Name對應的屬性

4.SymbolTable Modefy(SymbolTable Table, NameType Name, AttributeType Attr);將Table中指定名字Name的屬性修改為Attr

5.SymbolTable Insert(SymbolTable Table, NameType Name, AttributeType Attr);向Table中插入一個新名字Name及其屬性Attr

6.SymbolTable Delete(SymbolTable Table, NameType Name);從Table中刪除一個名字Name及其屬性

2.散列函數(shù)的構造方法

<0>:一個“好的”散列函數(shù)一般會考慮一下兩個因素:

(1):計算簡單上真,以便提高運轉(zhuǎn)速度

(2):關鍵詞對應的地址空間分布均勻咬腋,以盡量減少沖突

<2>:對于數(shù)字關鍵詞的散列函數(shù)構造

(1):直接定址法:取關鍵詞的某個線性函數(shù)值為散列地址,即h(key) = a*k + b;

(2):除留余數(shù)法:散列函數(shù)為:h(key) = key % p; 一般的p為TableSize或者質(zhì)數(shù)睡互。

(3):數(shù)字分析法:分析數(shù)字關鍵字在各位上的變化情況根竿,取比較隨機的位作為散列地址;比如所有號碼的后四位作為地址就珠。

(4):折疊法:把關機那次分割成位數(shù)相同的幾個部分寇壳,然后疊加:如56793542 ---->542 + 793 + 056 = ---->1391---->391

(5):平方取中法:如56793542---->56793542 * 56793542 = 322550(641)2905764

<3>:字符關鍵詞的散列函數(shù)構造

(1):一個簡單的散列函數(shù)----ASCII碼加和法:對字符型關鍵詞key定義散列函數(shù)如下:

h(key) = ( \sum_{}  key[i[) mod TableSize
.

(2):簡單的改進-----前三個字符移位法:h(key) = (key[0] * 27^2 + key[1] * 27 + key[2] * 1) mod TableSize;

(3):好的散列函數(shù)------移位法:涉及關鍵詞的所有n個字符,并且分布的很好:

h(key) = (\sum_{i = 0}^{n-1}key[n - i - 1] \times 32^i ) mod   TableSize

<4>:裝填因子:設散列表空間大小位m妻怎,填入表中的元素個數(shù)是n壳炎,則a = n / m稱為列表的裝填因子。

3.沖突處理方法

<1>:常用處理沖突的思路:

(1):換一個位置:開放地址法

(2):同一位置的沖突對象組織在一起:鏈地址法

<2>:開放地址法:一旦產(chǎn)生沖突逼侦,就按某種規(guī)則去尋找另一空地址

若發(fā)生了第i次沖突匿辩,試探的下一個地址將增加di,基本公式是:

hi(key) = (h(key) + di) mod TableSize;

di決定了不同的解決沖突的方案:線性探測榛丢、平方探測铲球、雙散列

(1):線性探測法:以增量序列1,2晰赞,...睬辐,(TableSize - 1)循環(huán)探測下一個存儲地址

(2):平方探測法----二次探測:以增量序列1^2, - 1^2, 2^2, - 2^2, ... . q^2, - q^2,且

q \leq \lfloor TableSize / 2 \rfloor
循環(huán)試探下一個存儲地址宾肺。

注意:平方探測法存在當HashTable還有空間時溯饵,但是并不能找到的特點。

有定理顯示:如果散列表的長度TableSize是某個4k + 3(k 是正整數(shù))形式的素數(shù)時锨用,平方探測法就能探測到整個散列表空間丰刊。、

Ps:在開放地址散列表中增拥,刪除操作要很小心啄巧。通常只能“懶惰刪除”,即需要增加一個“刪除標記(Deleted)”掌栅,而并不是真正的刪除它秩仆,一遍超找不到時會"斷鏈"。其空間可以在下次插入時重用猾封。

(3):雙散列探測法(Double Hashing):di為i*h2(key)澄耍,h2(key)是另外一個散列函數(shù),探測序列:h2(key), 2h2(key), 3h2(key), ... .

i:對任意的key,h2(key) != 0

ii:探測序列還應該保證所有的散列存儲單元都應該能夠被探測到齐莲,選擇一下形式具有良好的效果:h2(key) = p - (key mod p);其中p痢站,TableSize都是素數(shù)

(4):再散列

i:當散列表的元素太多時(即裝填因子a太大時),查找效率會下降选酗。實用的最大裝填因子:0.5 <= a <= 0.85

ii:當裝填因子過大時阵难,解決的方法是加倍擴大散列表,這這過程叫做“再散列”

iii:分離鏈式法:將相應位置上沖突的所有關鍵詞存儲在同一個單鏈表中芒填。

4.散列表的性能分析

<1>:平均查找長度(ASL)用來衡量散列表的查找效率:成功呜叫、不成功

<2>:關鍵詞的比較次數(shù),取決于產(chǎn)生沖突的多少殿衰。影響產(chǎn)生沖突多少有以下三個因素:

(1):散列函數(shù)是否均勻

(2):處理沖突的方法

(3):散列表的裝填因子a

emmm朱庆,代碼碼了一半,還有一些不太會播玖,晚幾天慢慢把它都理解透了再補上來椎工。
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饭于,一起剝皮案震驚了整個濱河市蜀踏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掰吕,老刑警劉巖果覆,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異殖熟,居然都是意外死亡局待,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門菱属,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钳榨,“玉大人,你說我怎么就攤上這事纽门⊙Τ埽” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵赏陵,是天一觀的道長饼齿。 經(jīng)常有香客問我,道長蝙搔,這世上最難降的妖魔是什么缕溉? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮吃型,結果婚禮上证鸥,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好敌土,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布镜硕。 她就那樣靜靜地躺著,像睡著了一般返干。 火紅的嫁衣襯著肌膚如雪兴枯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天矩欠,我揣著相機與錄音财剖,去河邊找鬼。 笑死癌淮,一個胖子當著我的面吹牛躺坟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乳蓄,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咪橙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虚倒?” 一聲冷哼從身側(cè)響起美侦,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎魂奥,沒想到半個月后菠剩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡耻煤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年具壮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哈蝇。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡棺妓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炮赦,到底是詐尸還是另有隱情怜跑,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布眼五,位于F島的核電站妆艘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏看幼。R本人自食惡果不足惜批旺,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诵姜。 院中可真熱鬧汽煮,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鞋囊,卻和暖如春止后,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溜腐。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工译株, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挺益。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓歉糜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親望众。 傳聞我的和親對象是個殘疾皇子匪补,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354