你真的學會哈希表了麼?

前言

這是我聽老師講課做的筆記,考試要看的。
作者:RodmaChen
關注我的csdn博客,更多數據結構與算法知識還在更新

一. 概念

基本思想

根據問題中的關鍵字構造一個合適的函數,利用這個函數求得各記錄的存儲位置,然後存儲;在查找時用相同的函數找其元素。

即:Addr(ai)=H(Ki)

其中: Addr(ai)ai的存儲地址,H爲散列函數,Kiai的關鍵字

散列表(哈希表):按散列存儲方式構造的存儲結構爲散列表。

散列函數(哈希函數):H(ki),關鍵字與表之間的對應關係。

散列地址(哈希地址):散列函數的值。

散列:將結點按關鍵字的散列地址存儲到散列表中的過程,又稱哈希造表。

同義詞 :k₁ ≠k₂,但H(k₁)=H(k₂),即映射到同一哈希地址上的關鍵碼k1 和k2爲同義詞。

衝 突:k₁ ≠k₂,但H(k₁)=H(k₂),將不同的關鍵碼映射到同一個哈希地址上,即同義詞之間發生地址爭奪的現象。

二.構造哈希表

1.直接定址法

取關鍵字的某個線性函數值爲哈希地址。

H(key)=key 或H(key)=a*key+b

例:H(key)=學號-2009100100

2 .數字分析法

把字符型關鍵詞量化,對其中的數字進行分析,誰最均勻就取誰。

3 .除留求餘法

H(key)=key%p

p<=m
m 爲哈希表的表長
p爲不超過m的最大素數

三.處理衝突的方法

1.開放定址法(open Addressing )

所謂開放定址法,即是由關鍵字得到的哈希地址一旦產生了衝突,也就是說,該地址已經存放了數據元素,就去尋找下一個空的哈希地址,只要哈希表足夠大,空的哈希地址總能找到,並將數據元素存入。

$H_i$=(Hash(key)+$d_i$) mod m i=1,2,…k (k<=m-1)
其中:

H(key)爲哈希函數

m爲哈希表長度

did_i增量序列,可有下列3種取法:

  • 線性探測再散列

did_i =1,2,3,…,m-1

  • 二次探測再散列

did_i= 1²,-1²,2² ,-2²,3²,…,±k², k≤ m/2)

  • 僞隨機探測再散列

did_i =僞隨機數序列

2.鏈地址法(拉鍊法 )

設哈希函數得到的哈希地址在區間[0,m-1]上,以每個哈希地址作爲一個指針,指向一個鏈。
每個鏈表中的結點都是同義詞。

列:關鍵碼序列爲47,7,29,11,16,92,22,8,3,50,37,89,94,21

哈希函數爲:Hash(key)=key mod 11

拉鍊法處理衝突,如下表所示

四.邊學邊練

已知查找表爲{19,01,23,14,55,20,84,27,68,11,10,77},設定哈希函數爲:H(key)=key % 13,採用開放地址法的二次探測法解決衝突,試在0~18的散列地址空間中對該關鍵字構造哈希表,並求出查找成功時的平均查找長度。

H(19)=19%13=6

H(01)=01%13=1

H(23)=23%13=10

H(14)=14%13=1(衝突) H(14)=(1+1)%13=2

H(55)=55%13=3

H(20)=20%13=7

H(84)=84%13=6(衝突) H(84)=(6+1)%13=7(仍衝突)

H(84)=(6-1)%13=5

H(27)=27%13=1(衝突) H(27)=(1+1)%13=2(仍衝突)

H(27)=(1-1)%13=0

H(68)=68%13=3(衝突) H(63)=(3+1)%13=4

H(11)=11%13=11

H(10)=10%13=10(衝突) H(10)=(10+1)%13=11(仍衝突)

H(10)=(10-1)%13=9

H(77)=77%13=12

因此哈希表如下:
在這裏插入圖片描述

本人博客:https://blog.csdn.net/weixin_46654114
本人b站求關注:https://space.bilibili.com/391105864
轉載說明:跟我說明,務必註明來源,附帶本人博客連接。

請給我點個贊鼓勵我吧
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章