軟件評測師寫作專欄之哈希表和數組17

各位學員大家好,大家在學習程序設計語言的時候,數組基本上是每年必考的題目,哈希表這幾年也開始出題。爲了讓大家快速掌握這方面的知識點,接下來就帶領大家一起來學習一下!

例題1:對於關鍵字序列(10,34,37,51,14,25,56,22,3), 用線性探查法解決衝突構造哈希表,哈希函數爲H(key)=key%11,關鍵字25存入的哈希地址編號爲( )。

A、2   

B、3   

C、5   

D、6

【昊洋詳解】:本題考查哈希表的基礎知識。

哈希表:通過一個以記錄的關鍵字爲自變量的函數(稱爲哈希函數) 得到該記錄的存儲地址,在哈希表中進行查找操作時,需用同一哈希函數計算得到待查記錄的存儲地址,然後到相應的存儲單元去獲得有關信息再判定查找是否成功。根據設定的哈希函數H(key)和處理衝突的方法,將一組關鍵字映射到一個有限的連續的地址集(區間)上,並以關鍵字在地址集中的“像”作爲記錄在表中的存儲位置,這種表稱爲哈希表,這一映射過程稱爲哈希造表或散列,所得的存儲位置稱爲哈希地址或散列地址。

用線性探查法解決衝突構造哈希表的步驟如下:

1)、序列的長度爲11,標號0到10;

2)、依次將數帶入哈希函數求哈希值,哈希值對應步驟1中標號;

3)、如果步驟2)的哈希值對應的標號已經被佔用,則往後一位,直到未佔用的位置存放;

4)、如果,步驟3)到了最後一個標號還未找到,則從0開始找,找到該哈希值之前。

關鍵字序列(10,34,37,51,14,25,56,22,3)通過key%11計算得到對應的序列(10,1,4,7,3,3,1,0,3)。需要注意的是,我們的序列是按照順序依次進行存放的,本題25代入哈希值爲3,其中3已被14所佔,後退一位4號被37佔用,其中5號爲空,所以25應該存入標號爲5的位置。

故該題目的正確答案爲:C。


例題2:設數組a[0 ... n-1,0 ...m-1](n>1,m>1)中的元素以行爲主序存放,每個元素佔用4個存儲單元,則數組元素a[i,j](0≤i<n,0≤j<m)的存儲位置相對於數組空間首地址的偏移量爲()。

A、(j*m+i)*4    

B、(i*m+j)*4   

C、(j*n+i)*4   

D、(i*n+j)*4

【昊洋詳解】:本題考查數據結構中數組的基礎知識。

數組:是定長線性表在維數上的擴展,即線性表中的元素又是一個線性表。n維數組是一種“同構”的數據結構,其每個數據元素類型相同、結構一致。以二維數組A[m, n]爲例,可以把它看成是一個定長的線性表,它的每個元素也是一個定長線性表。如下圖所示:


數組元素的存儲地址=數組空間首地址+偏移量,其中偏移量的計算方式爲排列在所訪問元素之前的元素個數乘以每個元素佔用的存儲單元數。對於元素a[i,j],在按行存儲(以行爲主序存放,就是第一行存儲完畢後,開始存儲第二行,直到最後一行)方式下,其中元素是從0開始計算的,所以0就是第一個元素,從第0行和0列開始算起,每一行有m個元素,每一列有n個元素,每個元素佔用4個存儲單元,在a[i,j]前面已經有i行元素,然後在本行中,前面有j個元素,所以a[i,j]相對於數組空間首地址的偏移量爲(i*m+j)*4。

故該題目的正確答案爲:B。

鞏固練習題

(1)設數組a[1..10,1..8]中的元素按行存放,每個元素佔用4個存儲單元,已知第一個數組元素a[1,1]的地址爲1004,那麼a[5,6]的地址爲( )。

A、1004+(5*8+6)*4

B、1004+(4*8+5)*4

C、1004+(5*10+6)*4

D、1004+(4*10+5)*4


(2)設數組a[0..n-1,0..m-1] (n>0,m>0)中的元素以列爲主序存放,每個元素佔用1個存儲單元,則數組元素a[i,j](0≤i≤n-1,0≤j≤m-1)相對於數組空間首地址的偏移量爲()。

A、i*m+j  

B、(i-1)*n+j-1   

C、j*n+i    

D、(j-1)*n+i-1


(3)若關鍵碼序列(23,35,14,49,8,12,30,7)採用散列法進行存儲和查找。設散列函數爲H(Key)=Key%11,採用線性探查法(順序地探查可用存儲單元)解決衝突,尚未構造完成的散列表如下所示,則元素12應存入哈希地址單元( )。


A、0

B、4

C、6

D、10

練習題參考答案

(1)解析:本題考查數據結構中數組的基礎知識。

數組元素的存儲地址=數組空間首地址+偏移量,其中偏移量的計算方式爲排列在所訪問元素之前的元素個數乘以每個元素佔用的存儲單元數。

由題目可知,本題數組下標從1開始,a[5,6],按行存儲,其前(5-1)=4行已經存滿,每行8個元素,每列10個元素,所在行前(6-1)=5個元素位已經存滿,所以a[5,6],偏移的元素個數爲:4*8+5。每個元素佔用4個存儲單元,已知第一個數組元素a[1,1]的地址爲1004,那麼a[5,6]的地址爲1004+(4*8+5)*4。

故該題目的正確答案爲:B。

(2)解析:本題考查數據結構中數組的基礎知識。

數組元素的存儲地址=數組空間首地址+偏移量,其中偏移量的計算方式爲排列在所訪問元素之前的元素個數乘以每個元素佔用的存儲單元數。

數組 a[0..n-1,0..m-1] (n>0,m>0)表示有n行m列,對於元素a[i,j],在按列存儲(以列爲主序存放,先存放第一列,然後存放第二列,直到最後一列)方式下,該元素之前有j列完整(因爲首列編號爲0)的元素,每一列n個元素,在第j列之前有i個元素(因爲首行編號爲0),每個元素佔用1個存儲單元,所以偏移量爲j*n+i。

故該題目的正確答案爲C。

 

(3)解析:本題考查哈希表的基礎知識。

根據構造哈希表的方式(具體的方法可以參考例題的解析),先由哈希函數計算12在哈希表中的存儲位置爲(12%11)=1,此時因1號單元被23佔用而發生衝突,線性探查法解決衝突的方式是順序地探查2號單元,仍然衝突,再探查3號單元,繼續衝突,再探查4號單元,不再衝突,從而在經過4次探查後把12存入空閒的4號單元。

故該題目的正確的答案爲B。

作者唯一官方個人微信公衆號(昊洋與你一起成長):HYJY20180101

寫於2020年9月4日

作者:昊洋講師

版權所有,侵權必究

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章