前言
這是我聽老師講課做的筆記,考試要看的。
作者:RodmaChen
關注我的csdn博客,更多數據結構與算法知識還在更新
一. 概念
基本思想
根據問題中的關鍵字構造一個合適的函數,利用這個函數求得各記錄的存儲位置,然後存儲;在查找時用相同的函數找其元素。
即:Addr(ai)=H(Ki)
其中:
Addr(ai)
爲ai
的存儲地址,H
爲散列函數,Ki
爲ai
的關鍵字
散列表(哈希表):按散列存儲方式構造的存儲結構爲散列表。
散列函數(哈希函數):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
爲哈希表長度
爲增量序列,可有下列3種取法:
- 線性探測再散列
=1,2,3,…,m-1
- 二次探測再散列
= 1²,-1²,2² ,-2²,3²,…,±k², k≤ m/2)
- 僞隨機探測再散列
=僞隨機數序列
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
轉載說明:跟我說明,務必註明來源,附帶本人博客連接。
請給我點個贊鼓勵我吧