1. 程式人生 > >雜湊表(等概率情況下)查詢成功與查詢不成功的平均查詢長度

雜湊表(等概率情況下)查詢成功與查詢不成功的平均查詢長度

繼續小結,做到一道求 雜湊表查詢成功與查詢不成功 情況下平均查詢長度的計算問題,迷惑了好一會,在這裡總結下來:

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

  題目:

在地址空間為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。