哈希表等概率情况下查找成功和查找不成功的平均查找长度的计算
最近復(fù)習(xí)了下數(shù)據(jù)結(jié)構(gòu)中的哈希表,發(fā)現(xiàn)在計(jì)算等概率情況下查找不成功的平均查找長度時(shí)比較迷茫,不知道到底是怎么計(jì)算出來的。現(xiàn)在通過查閱資料終于知道如何計(jì)算了,所以記錄下來以供以后查閱。
?? 下面看下2010年2010年全國碩士研究生入學(xué)統(tǒng)一考試計(jì)算機(jī)科學(xué)與技術(shù)學(xué)科聯(lián)考計(jì)算機(jī)學(xué)科專業(yè)基礎(chǔ)綜合試題中一個(gè)考哈希表的題。
Question1:
將關(guān)鍵字序列(7、8、30、11、18、9、14)散列存儲到散列表中。散列表的存儲空間是一個(gè)下標(biāo)從0開始的一維數(shù)組,散列函數(shù)為:????? H(key) = (keyx3) MOD 7,處理沖突采用線性探測再散列法,要求裝填(載)因子為0.7。
(1) 請畫出所構(gòu)造的散列表。
(2) 分別計(jì)算等概率情況下查找成功和查找不成功的平均查找長度。
Ans:
(1).首先明確一個(gè)概念裝載因子,裝載因子是指所有關(guān)鍵子填充哈希表后飽和的程度,它等于 關(guān)鍵字總數(shù)/哈希表的長度。 根據(jù)題意,我們可以確定哈希表的長度為 L = 7/0.7 = 10;因此此題需要構(gòu)建的哈希表是下標(biāo)為0~9的一維數(shù)組。根據(jù)散列函數(shù)可以得到如下散列函數(shù)值表。
H(Key) = (keyx3) MOD 7, 例如key=7時(shí), H(7) = (7x3)%7 = 21%7=0,其他關(guān)鍵字同理。
| Key | 7 | 8 | 30 | 11 | 18 | 9 | 14 |
| H(Key) | 0 | 3 | 6 | 5 | 5 | 6 | 0 |
(表1)
采用線性探測再散列法處理沖突,所構(gòu)造的散列表為:
| 地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 關(guān)鍵字 | 7 | 14 | ? | 8 | ? | 11 | 30 | 18 | 9 | ? |
(表2)
下面對散列表的構(gòu)造方式加以說明,注意表1中的關(guān)鍵字7和14,30和9, 11和18,這三組關(guān)鍵子的H(Key)值相同,這在構(gòu)建散列表時(shí)就會產(chǎn)生沖突,因?yàn)樗麄兊牡刂废嗤?#xff0c;所以要通過一定的沖突處理方法來解決這個(gè)問題。依題,采用線性探測再散列法處理沖突。下面詳細(xì)介紹如何構(gòu)建散列表:
?????? 第一個(gè)key 7,它的地址是0,因此放到散列表的數(shù)組下表為0的位置,這個(gè)位置上沒有關(guān)鍵字,因此沒有沖突可以直接填入;
?????? 第二個(gè)key 8,它的地址是3,因此放到散列表的數(shù)組下表為3的位置,這個(gè)位置上沒有關(guān)鍵字,因此沒有沖突可以直接填入;
?????? 第三個(gè)key 30,它的地址是6,因此放到散列表的數(shù)組下表為6的位置,這個(gè)位置上沒有關(guān)鍵字,因此沒有沖突可以直接填入;
?????? 第四個(gè)key 11,它的地址是5,因此放到散列表的數(shù)組下表為5的位置,這個(gè)位置上沒有關(guān)鍵字,因此沒有沖突可以直接填入;
?????? 第五個(gè)key 18,它的地址是5,因此放到散列表的數(shù)組下表為5的位置,但這個(gè)位置上已經(jīng)有關(guān)鍵字11,遇到了沖突,此時(shí)我們根據(jù)線性探測再散列法來處理這個(gè)沖突,探測下一個(gè)位置6, 6這個(gè)位置上已經(jīng)存在關(guān)鍵字30則繼續(xù)增加步長1,因此現(xiàn)在的新地址應(yīng)為7,位置7上沒有關(guān)鍵字,放入即可,到此沖突已經(jīng)解決;
?????? 第六個(gè)key 9,它的地址是6,因此放到散列表的數(shù)組下表為6的位置,但這個(gè)位置上已經(jīng)有關(guān)鍵字30,遇到了沖突,探測下一個(gè)位置7, 7這個(gè)位置上已經(jīng)存在關(guān)鍵字18則繼續(xù)增加步長1,因此現(xiàn)在的新地址應(yīng)為8,位置8上沒有關(guān)鍵字,放入即可;???
?????? 第七個(gè)key 14,它的地址是0,因此放到散列表的數(shù)組下表為0的位置,但這個(gè)位置上已經(jīng)有關(guān)鍵字7,遇到了沖突,探測下一個(gè)位置1, 位置1上沒有關(guān)鍵字,放入即可;???
?????? 到這一步所有關(guān)鍵字均已填入,散列表已經(jīng)構(gòu)造完成,如表2所示。
(2)等概率情況下查找成功平均查找長度:
??????? 這一問可以根據(jù)第一問的構(gòu)造過程求解:
??????? key7一次就填入了表中,因此查找次數(shù)為1,同理8, 30, 11查找次數(shù)均為1; key18 進(jìn)行了3次放入操作,探測位置分別是5,6,7 ,因此查找次數(shù)為3;key9也是3次;key14 進(jìn)行了兩次探測,因此查找次數(shù)為2。次數(shù)表如表3所示
| Key | 7 | 8 | 30 | 11 | 18 | 9 | 14 |
| Count | 1 | 1 | 1 | 1 | 3 | 3 | 2 |
(表3)
??????? 所以ASLsuccess= (1+1+1+1+3+3+2)/ 7 = 12/7。??
??????? 等概率情況下查找不成功的平均查找長度:
??????? 接下來討論不成功的情況, 看表2,計(jì)算查找不成功的次數(shù)就直接找關(guān)鍵字到第一個(gè)地址上關(guān)鍵字為空的距離即可, 但根據(jù)哈希函數(shù)地址為MOD7,因此初始只可能在0~6的位置。等概率情況下,查找0~6位置查找失敗的查找次數(shù)為:
?? 看地址0,到第一個(gè)關(guān)鍵字為空的地址2的距離為3,因此查找不成功的次數(shù)為3.?????
??????? 地址1, 到第一個(gè)關(guān)鍵為空的地址2的距離為2,因此查找不成功的次數(shù)為2.
??????? 地址2,? 到第一個(gè)關(guān)鍵為空的地址2的距離為1,因此查找不成功的次數(shù)為1.
??????? 地址3,到第一個(gè)關(guān)鍵為空的地址4的距離為2,因此查找不成功的次數(shù)為2.
??????? 地址4,到第一個(gè)關(guān)鍵為空的地址4的距離為1,因此查找不成功的次數(shù)為1.
??????? 地址5,到第一個(gè)關(guān)鍵為空的地址2(注意不是地址9,因?yàn)槌跏贾豢赡茉?~6之間,因此循環(huán)回去)的距離為5,因此查找不成功的次數(shù)為5.
??????? 地址6,到第一個(gè)關(guān)鍵為空的地址2(注意不是地址9,因?yàn)槌跏贾豢赡茉?~6之間,因此循環(huán)回去)的距離為4,因此查找不成功的次數(shù)為4.
??????? 因此查找不成功的次數(shù)表如下表所示
| Key | 7 | 8 | 30 | 11 | 18 | 9 | 14 |
| Count | 3 | 2 | 1 | 2 | 1 | 5 | 4 |
?????? 所以ASLunsuccess= (3+2+1+2+1+5+4)/ 7 = 18/7。
?
總結(jié)
以上是生活随笔為你收集整理的哈希表等概率情况下查找成功和查找不成功的平均查找长度的计算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: const pointer
- 下一篇: 腾讯附加题