作到一道求 哈希表查找成功與查找不成功 狀況下平均查找長度的計算問題,迷惑了好一會,在這裏總結下來:函數
首先,你要明白的是平均查找長度求的是指望,那麼你就按照求指望的方法來求平均查找長度吧,千萬記着指望怎麼求平均查找長度就怎麼求啊。spa
題目:指針
在地址空間爲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 26ci
解決以下:hash
(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 -> 2table
0方法 |
1總結 |
2top |
3tab |
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。