一、線性探測再散列法
Hash表: 元素的值(value)和在數組中索引位置(index)有一個確定關系
Index = Hash(key) ==> y = f(x)
Index有可能相同,怎么處理沖突?
在“處理沖突”上可能會有不同的方法。
示例 :
將關鍵字序列(7、8、30、11、18、9、14)散列存儲到散列表中。散列表的存儲空間是一個下標從0開始的一維數組。散列函數為: H(key) = (keyx3) MOD 7,處理沖突采用線性探測再散列法,要求裝填(載)因子為0.7。
(1) 請畫出所構造的散列表;
(2) 分別計算等概率情況下查找成功和查找不成功的平均查找長度。
1.散列表:
α = 表中填入的記錄數/哈希表長度 ==> 哈希表長度 = 7/0.7 = 10
H(7) = (7x3) MOD 7 = 0 H(8) = (8x3) MOD 7 = 3 H(30) = (30x3)MOD 7 = 6
H(11) = (11x3) MOD 7 = 5 H(18) = (18x3) MOD 7 = 5 H(9) = (9x3) MOD 7 = 6 H(14) = (14x3) MOD 7 = 0
按關鍵字序列順序依次向哈希表中填入,發生沖突后按照“線性探測”探測到第一個空位置填入。
2.查找長度:
2.1 查找成功的平均查找長度
(待查找的數字肯定在散列表中才會查找成功)
查找數字A的長度 = 需要和散列表中的數比較的次數;
步驟:
比如 查找數字:8
則 H(8) = (8x3) MOD 7 = 3
哈希表中地址3處的數字為8,進行了第一次比較:8 = 8,則查找成功,查找長度為1;
比如查找數字:14
則 H(14) = (14x3) MOD 7 = 0
哈希表中地址0處的數字為7,進行第一次比較:7≠14
哈希表中地址1處的數字為14,進行第二次比較:14=14 ,則查找成功,查找長度為2。
所以總的查找成功的平均查找長度= (1+1+1+1+3+3+2)/7 = 12/7
2.2 查找不成功的平均查找長度
(待查找的數字肯定不在散列表中)
【解題的關鍵之處】根據哈希函數地址為MOD7,因此任何一個數經散列函數計算以后的初始地址只可能在0~6的位置
查找0~6位置查找失敗的查找次數為:
地址0,到第一個關鍵字為空的地址2需要比較3次,因此查找不成功的次數為3.
地址1,到第一個關鍵字為空的地址2需要比較2次,因此查找不成功的次數為2.
地址2,到第一個關鍵字為空的地址2需要比較1次,因此查找不成功的次數為1.
地址3,到第一個關鍵字為空的地址4需要比較2次,因此查找不成功的次數為2.
地址4,到第一個關鍵字為空的地址4需要比較1次,因此查找不成功的次數為1.
地址5,到第一個關鍵字為空的地址9,因此查找不成功的次數為5.
地址6,到第一個關鍵字為空的地址9,因此查找不成功的次數為4.
於是得到如下數據:
二、平方探測再散列(二次探測再散列):
線性探測再散列
二次探測再散列