哈希表(等概率情況下)查找成功與查找不成功的平均查找長度


做到一道求 哈希表查找成功與查找不成功 情況下平均查找長度的計算問題,迷惑了好一會,在這里總結下來:

  首先,你要明白的是平均查找長度求的是期望,那么你就按照求期望的方法來求平均查找長度吧,千萬記着期望怎么求平均查找長度就怎么求啊。

  題目:

在地址空間為0~16的散列區中,對以下關鍵字序列構造兩個哈希表:
{Jan, Feb, Mar, Apr, May,  June, July, Aug, Sep, Oct, Nov, Dec}
(1) 用線性探測開放地址法處理沖突;
(2) 用鏈地址法(開散列存儲)處理沖突 
並分別求這兩個哈希表在等概率情況下查找成功和查找不成功時的平均查找長度。設哈希函數為 
H(key) = i/2,其中i為關鍵字中第一個字母在字母表中的序號,如下:
A B C D E F G H I  J    K   L  M  N  O   P   Q   R  S  T   U   V   W  X  Y   Z
1 2 3 4  5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

  解決如下:

(1) 線性探測進入散列區的次序如下,X 代表沖突,要找下一個空格
Jan -> 5
Feb -> 3
Mar -> 6
Apr -> 0
May -> 6X -> 7
June -> 5X -> 6X -> 7X -> 8
July -> 5X -> 6X -> 7X -> 8X -> 9
Aug -> 0X -> 1
Sep -> 9X -> 10
Oct -> 7X -> 8X -> 9X -> 10X -> 11
Nov -> 7X -> 8X -> 9X -> 10X -> 11X -> 12
Dec -> 2

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Apr

Aug

Dec

Feb

 

Jan

Mar

May

Jun

July

Sep

OCt

Nov

 

 

 



  很明顯,查找成功時,查找Jan、Feb、Mar等僅需要一次,其余的也可以由上面看出來
  所以查找成功時平均查找長度 (ASL) = (1 + 1 + 1 + 1 + 2 + 4 + 5 + 2 + 2 + 5 + 6 + 1) / 12 = 31/12 = 2.58 為什么是除以12呢?因為查找成功的情況總共有12種啊

  查找不成功時呢?什么是查找不成功呢?查找不成功就是從查找位置開始直到一個位置為空需要比較的次數。

  首先,26/2=13,也就是說查找不成功的情況也只能出現在0~13之間,只有這14種情況。

  舉個例子來說,查找Aay吧,根據hash表,與Apr比較不匹配,接着與Aug比較又是不匹配,接着與Dec比較又是不匹配,又與Feb比較又是不匹配,到了4位置的時候為空了,即4上內容與nullkey比較,結果為空,所以查找Aay失敗,查找長度為5。同理也能計算其他的。

  最終平均查找失敗時平均查找長度為(5+4+3+2+1+9+8+7+6+5+4+3+2+1)/14=60/14。注意啊,這里是除以14啊。(這是求期望的方法啊)

(2) 鏈地址法
0 之下有 Apr, Aug
2 之下有 Dec
3 之下有 Feb
5 之下有 Jan, June, July
6 之下有 Mar, May
7 之下有 Oct, Nov
9 之下有 Sep
查找成功時候,查 Apr, Dec, Feb, Jan, Mar, Oct, Sep 各需 1 次,查 Aug, June, May, Nov 各需 2 次,查 July 需 3 次。

所以查找成功時平均查找長度 (ASL) = (1 * 7 + 2 * 4 + 3 * 1) / 12 = 18/12 = 1.5

查找失敗時平均查找長度:舉個例子吧,查找Boy,2/2=1,而1的地方的指針為空,就不用比較就可以知道不存在,查找產度為0。查找Aay,與Apr比較不匹配,與Aug比較不匹配,同時,Aug指向下一個節點的指針為空,就可以知道查找失敗,查找長度為2。

 所以查找失敗的平均查找長度:(2+1+1+3+2+2+1)/14=12/14。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM