http://www.cnblogs.com/21dacia/articles/1403006.html
一、哈希表的概念及作用
一般的線性表,樹中,記錄在結構中的相對位置是隨機的,即和記錄的關鍵字之間不存在確定的關係,因此,在結構中查找記錄時需進行一系列和關鍵字的比較。這一類查找方法建立在“比較“的基礎上,查找的效率依賴於查找過程中所進行的比較次數。
理想的情況是能直接找到需要的記錄,因此必須在記錄的存儲位置和它的關鍵字之間建立一個確定的對應關係f,使每個關鍵字和結構中一個唯一的存儲位置相對應。
哈希表最常見的例子是以學生學號爲關鍵字的成績表,1號學生的記錄位置在第一條,10號學生的記錄位置在第10條...
如果我們以學生姓名爲關鍵字,如何建立查找表,使得根據姓名可以直接找到相應記錄呢?
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
劉麗
劉宏英
吳軍
吳小豔
李秋梅
陳偉
...
姓名中各字拼音首字母
ll
lhy
wj
wxy
lqm
cw
...
用所有首字母編號值相加求和
24
46
33
72
42
26
...
最小值可能爲3 最大值可能爲78 可放75個學生
用上述得到的數值作爲對應記錄在表中的位置,得到下表:
成績一
成績二...
3
...
...
...
24
劉麗
82
95
25
...
26
陳偉
...
...
33
吳軍
...
...
42
李秋梅
...
...
46
劉宏英
...
...
72
吳小豔
...
...
78
...
上面這張表即哈希表。
如果將來要查李秋梅的成績,可以用上述方法求出該記錄所在位置:
李秋梅:lqm 12+17+13=42 取表中第42條記錄即可。
問題:如果兩個同學分別叫 劉麗 劉蘭 該如何處理這兩條記錄?
這個問題是哈希表不可避免的,即衝突現象:對不同的關鍵字可能得到同一哈希地址。
二、哈希表的構造方法
1、直接定址法
例如:有一個從1到100歲的人口數字統計表,其中,年齡作爲關鍵字,哈希函數取關鍵字自身。
地址
01
02
...
25
26
27
...
100
年齡
1
2
...
25
26
27
...
...
人數
3000
2000
...
1050
...
...
...
...
...
2、數字分析法
有學生的生日數據如下:
年.月.日
75.10.03
75.11.23
76.03.02
76.07.12
75.04.21
76.02.15
...經分析,第一位,第二位,第三位重複的可能性大,取這三位造成衝突的機會增加,所以儘量不取前三位,取後三位比較好。
3、平方取中法
取關鍵字平方後的中間幾位爲哈希地址。
4、摺疊法
將關鍵字分割成位數相同的幾部分(最後一部分的位數可以不同),然後取這幾部分的疊加和(捨去進位)作爲哈希地址,這方法稱爲摺疊法。
例如:每一種西文圖書都有一個國際標準圖書編號,它是一個10位的十進制數字,若要以它作關鍵字建立一個哈希表,當館藏書種類不到10,000時,可採用此法構造一個四位數的哈希函數。如果一本書的編號爲0-442-20586-4,則:
5864
5864
4220
0224
+)
04
+)
04
-----------
-----------
10088
6092
H(key)=0088
H(key)=6092
(a)移位疊加
(b)間界疊加
5、除留餘數法
取關鍵字被某個不大於哈希表表長m的數p除後所得餘數爲哈希地址。
H(key)=key MOD p (p<=m)
6、隨機數法
選擇一個隨機函數,取關鍵字的隨機函數值爲它的哈希地址,即
H(key)=random(key) ,其中random爲隨機函數。通常用於關鍵字長度不等時採用此法