软件评测师写作专栏之哈希表和数组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

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日

作者:昊洋讲师

版权所有,侵权必究

你可能感兴趣的:(软件评测师写作专栏之哈希表和数组17)