將關鍵字序列(七、八、30、十一、1八、九、14)散列存儲到散列表中。散列表的存儲空間是一個下標從0開始的一維數組,散列函數爲: H(key) = (keyx3) MOD 7,處理衝突採用線性探測再散列法,要求裝填(載)因子爲0.7。數組
(1) 請畫出所構造的散列表。函數
(2) 分別計算等機率狀況下查找成功和查找不成功的平均查找長度。spa
Ans:ci
(1).首先明確一個概念裝載因子,裝載因子是指全部關鍵子填充哈希表後飽和的程度,它等於 關鍵字總數/哈希表的長度。 根據題意,咱們能夠肯定哈希表的長度爲 L = 7/0.7 = 10;所以此題須要構建的哈希表是下標爲0~9的一維數組。根據散列函數能夠獲得以下散列函數值表。table
H(Key) = (keyx3) MOD 7, 例如key=7時, H(7) = (7x3)%7 = 21%7=0,其餘關鍵字同理。循環
Key | 7 | 8 | 30 | 11 | 18 | 9 | 14 |
H(Key) | 0 | 3 | 6 | 5 | 5 | 6 | 0 |
(表1)方法
採用線性探測再散列法處理衝突,所構造的散列表爲:tab
地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
關鍵字 | 7 | 14 | 8 | 11 | 30 | 18 | 9 |
(表2)di
下面對散列表的構造方式加以說明,注意表1中的關鍵字7和14,30和9, 11和18,這三組關鍵子的H(Key)值相同,這在構建散列表時就會產生衝突,由於他們的地址相同,因此要經過必定的衝突處理方法來解決這個問題。依 題,採用線性探測再散列法處理衝突。下面詳細介紹如何構建散列表:哈希表
第一個key 7,它的地址是0,所以放到散列表的數組下表爲0的位置,這個位置上沒有關鍵字,所以沒有衝突能夠直接填入;
第二個key 8,它的地址是3,所以放到散列表的數組下表爲3的位置,這個位置上沒有關鍵字,所以沒有衝突能夠直接填入;
第三個key 30,它的地址是6,所以放到散列表的數組下表爲6的位置,這個位置上沒有關鍵字,所以沒有衝突能夠直接填入;
第四個key 11,它的地址是5,所以放到散列表的數組下表爲5的位置,這個位置上沒有關鍵字,所以沒有衝突能夠直接填入;
第五個key 18,它的地址是5,所以放到散列表的數組下表爲5的位置,但這個位置上已經有關鍵字11,遇到了衝突,此時咱們根據線性探測再散列法來處理這個衝突,探 測下一個位置6, 6這個位置上已經存在關鍵字30則繼續增長步長1,所以如今的新地址應爲7,位置7上沒有關鍵字,放入便可,到此衝突已經解決;
第六個key 9,它的地址是6,所以放到散列表的數組下表爲6的位置,但這個位置上已經有關鍵字30,遇到了衝突,探測下一個位置7, 7這個位置上已經存在關鍵字18則繼續增長步長1,所以如今的新地址應爲8,位置8上沒有關鍵字,放入便可;
第七個key 14,它的地址是0,所以放到散列表的數組下表爲0的位置,但這個位置上已經有關鍵字7,遇到了衝突,探測下一個位置1, 位置1上沒有關鍵字,放入便可;
到這一步全部關鍵字均已填入,散列表已經構造完成,如表2所示。
(2)等機率狀況下查找成功平均查找長度:
這一問能夠根據第一問的構造過程求解:
key7一次就填入了表中,所以查找次數爲1,同理8, 30, 11查找次數均爲1; key18 進行了3次放入操做,探測位置分別是5,6,7 ,所以查找次數爲3;key9也是3次;key14 進行了兩次探測,所以查找次數爲2。次數表如表3所示
Key | 7 | 8 | 30 | 11 | 18 | 9 | 14 |
Count | 1 | 1 | 1 | 1 | 3 | 3 | 2 |
(表3)
因此ASLsuccess= (1+1+1+1+3+3+2)/ 7 = 12/7。
等機率狀況下查找不成功的平均查找長度:
接下來討論不成功的狀況, 看錶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,到第一個關鍵爲空的地址2(注意不是地址9,由於初始只可能在0~6之間,所以循環回去)的距離爲5,所以查找不成功的次數爲5.
地址6,到第一個關鍵爲空的地址2(注意不是地址9,由於初始只可能在0~6之間,所以循環回去)的距離爲4,所以查找不成功的次數爲4.
所以查找不成功的次數表以下表所示
Key | 7 | 8 | 30 | 11 | 18 | 9 | 14 |
Count | 3 | 2 | 1 | 2 | 1 | 5 | 4 |
(表4)
因此ASLunsuccess= (3+2+1+2+1+5+4)/ 7 = 18/7。