晚上,好像是深夜了,突然寫到這類題時遇到的疑惑,恰恰這個真題只讓計算成功的ASL,但我想學一下不成功的計算,只能自己來解決了,翻了李春葆和嚴蔚敏的教材沒有找到相關鏈地址法的計算,於是大致翻到兩篇不錯的博客,輾轉了牛客面試題,做個小總結。
題目1
將關鍵字序列{1 13 12 34 38 33 27 22} 散列存儲到散列表中。散列函數為:H(key)=key mod 11,處理沖突采用鏈地址法,求在等概率下查找成功和查找不成功的平均查找長度
1 mod 11=1,所以數據1是屬於地址1
13 mod 11=2,所以數據13是屬於地址2
12 mod 11=1,所以數據12也是屬於地址1(這個數據是數據1指針的另一個新數據)
34 mod 11=1,所以數據34是屬於地址1(這個數據是數據12指針的另一個新數據)
38 mod 11=5,所以數據38是屬於地址5
33 mod 11=0,所以數據33是屬於地址0
27 mod 11=5,所以數據27是屬於地址5,(這個數據是數據38指針的另一個新數據)
22 mod 11=0,所以數據22是屬於地址0,(這個數據是數據33指針的另一個新數據)
鏈地址法處理沖突構造所得的哈希表如下(采用頭插法):
查找成功時: ASL=(3×1+2×3+1×4)/8=13/8, 其中紅色標記為查找次數。也就是說,需查找1次找到的有4個,其它以此類推… 牛客中京東的一道面試題就是這個,成功的解法絕對唯一。
我就通俗解釋了,計算時貌似是豎着看,查找次數×個數,然后除以關鍵字個數,記為n=8
查找不成功時:ASL=(3+4+2+1+1+3+1+1+1+1+1)/11=19/11
這里注意:
鏈接法關於這個失敗長度有兩種觀點,一種算空結點,一種不算。據說王道408數據結構例題是算的,我沒入手暫不曉得。
該篇博客選擇計算,通俗解釋:計算時就橫着看,數所有查找次數,然后除以哈希表表長,記為m=11
題目2
假設散列表的長度是13,三列函數為H(K) = k % 13,給定的關鍵字序列為{32, 14, 23, 01, 42, 20, 45, 27, 55, 24, 10, 53}。畫出用拉鏈法解決沖突時構造的哈希表,並求出在等概率情況下,該方法的查找成功和查找不成功的平均查找長度。
查找成功時的平均查找長度:
ASL = (1×6+2×4+3×1+4×1)/12 = 7/4
結合上個題,這里的成功算法很容易就理解了
查找不成功時的平均查找長度:
ASL = (4+2+2+1+2+1)/13
這里就不算空指針。。。了
注意:查找成功時,分母為哈希表元素個數,查找不成功時,分母為哈希表長度
友情提示:別糾結不成功的計算了,深夜了,該睡了
參考: