1. 程式人生 > >Hash表的平均查找長度ASL計算方法

Hash表的平均查找長度ASL計算方法

hash表 ron red 二次 考研 table style 時間 長度

Hash表的“查找成功的ASL”和“查找不成功的ASL”

ASL指的是 平均查找時間

關鍵字序列:(7、8、30、11、18、9、14)

散列函數:
H(Key) = (key x 3) MOD 7

裝載因子:
0.7

處理沖突:線性探測再散列法


查找成功的ASL計算方法:

因為現在的數據是7個,填充因子是0.7。所以數組大小=7/0.7=10,即寫出來的散列表大小為10,下標從0~9。
第一個元素7,帶入散列函數,計算得0。
第二個元素8,帶入散列函數,計算得3。
第三個元素30,帶入散列函數,計算得6。
第四個元素11,帶入散列函數,計算得5。

第五個元素18,帶入散列函數,計算得5;此時和11沖突,使用線性探測法,得7。
第六個元素9,帶入散列函數,計算得6;此時和30沖突,使用線性探測法,得8。
第七個元素14,帶入散列函數,計算得0;此時和7沖突,使用線性探測法,得1。
所以散列表

地址0123456789
key 7 14 8 11 30 18 9

所以查找成功的計算:
如果查找7,則需要查找1次。
如果查找8,則需要查找1次。
如果查找30,則需要查找1次。
如果查找11,則需要查找1次。
如果查找18,則需要查找3次:第一次查找地址5,第二次查找地址6,第三次查找地址7,查找成功。

如果查找9,則需要查找3次:第一次查找地址6,第二次查找地址7,第三次查找地址8,查找成功。
如果查找地址14,則需要查找2次:第一次查找地址0,第二次查找地址1,查找成功。
所以,ASL=(1+2+1+1+1+3+3)/ 7=12/ 7


查找不成功的ASL計算方法:

鑒於網絡上有各種版本,本人認為此種計算方法比較合理。驗證實例可以參考2010年的計算機408考研真題的第一道計算大題和答案。

1. 定義什麽叫查找不成功
舉個例子來說吧。在已知上面散列表的基礎上,如果要查找key為4的關鍵字。根據散列函數可以計算Hash(key)=Hash(4)=5。此時在地址為5的地方取出那個數字,發現key=11,不等於4。這就說明在裝填的時候會發生沖突。根據沖突處理方法,會繼續檢測地址為6的值,發現key=30,依然不等。這個時候到了地址為6

,但是依然沒有找到。那麽就說明根本就沒有key=4這個關鍵字,說明本次查找不成功。註意:為什麽到地址6?因為散列函數中有 mod7 ,對應的地址為0~6,即0~6查找失敗的查找次數。
再舉一個例子。查找key為0的關鍵字,根據散列函數可以計算Hash(key)=Hash(0)=0。此時在地址為0的地方取出那個數字,發現key=7,不等於0。這就說明在裝填的時候會發生沖突。根據沖突處理方法,會繼續檢測地址為1的值,發現key=14,依然不等。這個時候到了地址為3,發現為空依然沒有找到。所以停止查找,本次查找不成功。因為如果key=0這個關鍵字存在的話,依照沖突處理函數,就一定能找到它。總不能丟了吧。

2. 根據第一點定義的不成功,依次推下去:
查找地址為0的值所需要的次數為3,
查找地址為1的值所需要的次數為2,
查找地址為2的值所需要的次數為1,
查找地址為3的值所需要的次數為2,
查找地址為4的值所需要的次數為1,
查找地址為5的值所需要的次數為5,
查找地址為6的值所需要的次數為4。
3.計算
查找不成功ASL=(3+2+1+2+1+5+4)/ 7=18/ 7

Hash表的平均查找長度ASL計算方法