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

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

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

 

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。 
所以散列表:

地址 0 1 2 3 4 5 6 7 8 9
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

  分類: 基本功Foundation

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。 
所以散列表:

地址 0 1 2 3 4 5 6 7 8 9
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