哈希专项练习


 

在哈希法存储中,冲突指的是 ( )

正确答案: A   你的答案: A (正确)
不同关键字值对应到相同的存储地址
两个数据元素具有相同序号
两个数据元素的关键字值不同,而非关键字值相同
数据元素过多
解析:
1.哈希函数:
  哈希法又称散列法、杂凑法以及关键字地址计算法等,相应的表成为哈希表。
  基本思想:首先在元素的关键字K和元素的位置P之间建立一个对应关系f,使得P=f(K),其中f成为哈希函数。
  创建哈希表时,把关键字K的元素直接存入地址为f(K)的单元;查找关键字K的元素时利用哈希函数计算出该元素的存储位置P=f(K).
  创建哈希表时,把关键字K的元素直接存入地址为f(K)的单元;查找关键字K的元素时利用哈希函数计算出该元素的存储位置P=f(K).
2.哈希冲突:
  当关键字集合很大时,关键字值不同的元素可能会映像到哈希表的同一地址上,即K1!=K2,但f(K1)=f(K2),这种现象称为hash冲突,实际中冲突是不可避免的,只能通过改进哈希函数的性能来减少冲突。


若线性表(24,13,31,6,15,18,8)采用散列(Hash)法进行存储和查找,设散列函数为H(Key)=Key mod 11,则构造散列表时发生冲突的元素为()(其中的mod表示整除取余运算)。

正确答案: A   你的答案: A (正确)
24和13
6 和15
6 和24
18和8
解析:
24取余11得13。 冲突13


HASH函数冲突处理方式不包括以下哪一项:
 

正确答案: C   你的答案: C (正确)
开放定址法
链地址法
插入排序法
公共溢出区发

解析:

C HASH函数冲突处理方式

(1)开放定值法  这个方法分为几种  其中一种是线性探索,就是这个值有冲突  就向下一个寻址 依次加1  向后直到不冲突为止,但是这样 有的时候会造成 效率偏低   。所以还有的时候会使用二次探索法  就是使用平方的方式  等。

(2)拉链法  这个方法就是 使用链表处理冲突  只要有冲突就增加一个链表节点。

(3)双哈希法  就是这个hash函数有冲突  就换一个hash函数试试。

(4)建立公共溢出区  这种方法就是将哈希表分为基本表和溢出表  凡是有冲突的就直接放到溢出区。

插入排序 是排序算法的一种  与哈希无关,所依选择C。

下述有关hash冲突时候的解决方法的说法,错误的有?

正确答案: B   你的答案: B (正确)
通常有两类方法处理冲突:开放定址(Open Addressing)法和拉链(Chaining)法。
开放定址更适合于造表前无法确定表长的情况
在用拉链法构造的散列表中,删除结点的操作易于实现
拉链法的缺点是:指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间
解析:
A:处理冲突方法:开放地址法和拉链法
B:拉链法的节点空间动态申请更适合无法确定表长的情况
C:想象其中有链表
D:规模较小,查找比较容易,用开放地址法能省空间

假定有k个关键字互为同义词,若用线性探测法把这k个关键字存入哈希表中,至少要进行多少次探测?()

正确答案: D   你的答案: B (错误)
k-1次
k次
k+1次
k(k-1)/2次

解析:
有k个关键字相同,对第一个进行哈希值计算时对应位置没有存放数,直接插入,无需探测。

对第二个数插入时探测次数为1,

以此类推

第k个插入时探测数为k-1.

所以

1+2+……+k-1=k*(k-1)/2才正确。


现有一完全的P2P共享协议,每次两个节点通讯后都能获取对方已经获取的全部信息,现在使得系统中每个节点都知道所有节点的文件信息,共17个节点,假设只能通过多次两个对等节点之间通讯的方式,则最少需要()次通讯

正确答案: C   你的答案: A (错误)
32
31
30
29

解析:

如上图1所示,假设有5个节点,按连线1、2、3、4通讯之后,节点4和5就掌握了所有节点的信息,之后,1、2、3节点只需跟4或5任一节点通讯一次即连线5、6、7就可保证每个节点都知道所有节点的信息,总的通讯次数是(n-1)+(n-2)=2n-3次。
如果将所有节点分成两组,如图2所示,两组中的节点分别按连线1-8顺序通讯之后,节点4和5就掌握了1-5所有节点的信息,节点9和0就掌握了6-0所有节点的信息,再按连线9、10通讯之后,节点4、5、9、0就掌握了1-0所有节点的信息,剩下的节点只需跟4、5、9、0任一节点通讯一次就可保证每个节点知道所有节点信息,和图1相比,多了9和10两次通讯,总的通讯次数是(2n1-3)+(2n2-3)+2=2n-4次(n1和n2分别表示分组中元素个数)。
分3组的情况是(2n1-3)+(2n2-3)+(2n3-3)+6=2n-3次
分4组的情况是(2n1-3)+(2n2-3)+(2n3-3)+(2n4-3)+8=2n-4次
 
 
既希望较快的查找又便于线性表动态变化的查找方法是()

正确答案: C   你的答案: B (错误)
顺序查找
折半查找
分块查找
哈希法查找
解析:
索引顺序查找又称为分块查找,是介于顺序查找和二分查找之间的一种查找方法

索引查找是在索引表和主表(即线性表的索引存储结构)上进行的查找。索引查找的过程是:首先根据给定的索引值K1,在索引表上查找出索引值等于K1的索引项,以确定K1对应的子表在主表中的开始位置和长度,然后再根据给定的关键字K2,在对应的子表中查找出关键字等于K2的元素(结点)。

对索引表或子表进行查找时,若表是顺序存储的有序表,则既可进行顺序查找,也可进行二分查找。否则只能进行顺序查找。

稀疏矩阵压缩的存储方法是:()

正确答案: A D   你的答案: B D (错误)
三元组
二维数组
散列
十字链表

解析:
三元组表示稀疏矩阵可大大节省空间,但是当涉及到矩阵运算时,要大量移动元素。

十字链表表示法可以避免大量移动元素。

节点结构如下:  down指向同列下一个节点,right指向同行下一个节点

矩阵部分表示如下:


 

以下属于Hash碰撞解决方法的是()

正确答案: A B C D   你的答案: A C D (错误)
线性探测
二次探测
拉链法
二次散列
解析:

常见哈希冲突解决办法:

1.开放地址法 2.线性探测法 3.链地址法(拉链法) 4.二次探测法

5.伪随机探测法 6.再散列(双重散列,多重散列) 7.建立一个公共溢出区

单旋转法是建立散列函数的一种方法,   ,将最后一位数,旋转放置到第一位

常见的散列函数有,直接定址法,数字分析法,平法取中法,取余法,折叠法,随机法


下列选项哪些是正确的
正确答案: D   你的答案: B D (错误)
对于unordered_map和map这两个容器,迭代器的有效性皆不受删除操作影响=
对于unordered_map和map这两个容器,迭代器的有效性皆不受插入操作影响
为了保证代码的异常安全性,应该避免在构造函数中抛异常
为了保证代码的异常安全性,应该避免在析构函数中抛异常

解析:
同理可以看到map的insert,unorder_map的insert和erase操作的这项属性。
A选项:当unorder_map和map某迭代器it指向的元素被删除时,只有该迭代器it失效,其他的迭代器不会失效。
B选项:map插入时不会引起迭代器失效;unorder_map插入时一般情况下不会引起迭代器失效,只有当容器增长到需要rehash时,原来的所有迭代器失效。
C选项:构造函数抛出异常后,已经构造的成员对象会被逆序析构,申请的内存资源会被系统释放,不会调用析构函数。而且构造函数抛出异常是唯一表明构造失败的方法。
D选项:effective C++“条款08:别让异常逃离析构函数”指出来如果析构函数抛出异常,对于vector<Widget>这样的一个对象数组,如果第一个Widget析构有异常抛出,这时候还要销毁数组中剩下的Widget否则会造成内存泄漏,但是如果剩下的Widget析构时也抛出异常,就会两个异常同时存在,程序如果不是结束执行就会产生不明确行为。即使不是使用容器或数组,在析构函数中抛出异常也可能导致程序过早结束或不明确行为。


 

Hash 表的平均查找长度与处理冲突的方法无关。()

正确答案: B   你的答案: A (错误)

正确

错误

解析:哈希表的平均查找长度与哈希函数、冲突处理方法和装填因子有关,但与哈希表长无关。
一般情况下哈希函数是均匀的,可不考虑它对平均查找长度的影响

下列不属于hash碰撞解决方法是?
正确答案: B   你的答案: B (正确)
线性探测
单旋转法
二次探测
拉链法
双重散列
多重散列

答案:B
旋转法是将数据的键值中进行旋转。
如5062101旋转之后得到1506210,
这是产生随机散列值(hash)的一种方法,不是解决hash碰撞的方法

常见哈希冲突解决办法:

1.开放地址法       2.线性探测法       3.链地址法(拉链法)      4.二次探测法

5.伪随机探测法    6.再散列(双重散列,多重散列)        7.建立一个公共溢出区

单旋转法是建立散列函数的一种方法, ,将最后一位数,旋转放置到第一位

常见的散列函数有:直接定址法,数字分析法,平法取中法,取余法,折叠法,随机法

设哈希表长度为11,哈希函数H(K)=(K的第一个字母在字母表中的序号)MOD11,若输入顺序为(D,BA,TN,M,CI,I,K,X,TA),采用内散列表,处理冲突方法为线性探测法,要求构造哈希表,在等概率情况下查找成功平均查找长度为()

正确答案: C   你的答案: A (错误)
4
3
20/9
23/9

解析:
线性探测:本位置x被占据,就寻找下一位x+1,直至找到空位置,所以:
(注意看清题目“K的第一个字母在字母表中的序号 ”)
D=4mode11=4,1次

B=2mod11=2,1次

T=20mod11=9,1次

M=13mod11=2->3,2次

C=3mod11=3->4->5,3次

I=9mod11=9->10,2次

K=11mod11=0,1次

X=24mod11=2->3->4->5->6,5次

T=20mod11=9->10->0->1,4次
9个数字,共20次,所以20/9。


假设把整数关键码K散列到有N个槽的散列表,以下那些散列函数是好的散列函数?
正确答案: C   你的答案: C (正确)
h(k)=k/n
h(k)=1
h(k)=k mod N
h(k)=(k + Random(N )) mod N;Random(N)返回一个0到N-1的整数

解析:
D中的随机取数有可能造成冲突,所以还是求模值比较好


设有n个关键字具有相同的Hash函数值,则用线性探测法把这n个关键字映射到HASH表中需要做()次线性探测。

正确答案: D   你的答案: D (正确)
n^2
n(n+1)
n(n+1)/2
n(n-1)/2

解析:
存放第一个元素时,不需做线性探测;
1+2+3+...+n-1 = (n-1)n/2


哈希函数有一个共同的性质,即函数值应当以()取其值域的每个值。
正确答案: D   你的答案: C (错误)


最大概率
最小概率
同等概率
平均概率

解析:
散列的基本思想是以结点的关键码作为自变量,通过散列函数将其映射到记录的存储地址。有时不同的关键码值经过同一散列函数计算后形成相同的存储地址,产生碰撞现象。由于处理碰撞的代价较大,应尽量避免。这就要求散列函数在作用于各记录关键码后的取值能同等均匀在存储空间上。


设哈希表长为14,哈希函数为h(key)=key%11。表中现有数据15、38、61和84,其余位置为空,如果用二次探测再散列处理冲突,则49的位置是

正确答案: D   你的答案: A (错误)

8
3
5
9

解析:
处理的冲突的一种方式
开放定址法:Hi=(H(key)+di)MOD m,其中H(key)为哈希函数;m为哈希表长;di为增量序列,可有以下三种取法:
<1>di=1,2,3,......m-1,称为线性探测再散列;
<2>di=1^2,-1^2,2^2,-2^2.......k^2,-k^2,(k<=m/2),称为二次探测再散列
<3>di=伪随机数序列,称伪随机探测再散列
哈希表如下

0    1    2    3    4    5    6    7    8    9    10    11    12    13
                    15    38    61    84                             
 
以此将15、38、61和84代入 哈希函数求的如上表
然后49%11=5%14=5有冲突,然后分别将di=1,-1代入都有冲突,
当di=4时没有冲突 所以49的位置是5+4=9
 
 
下列关于线性表,二叉平衡树,哈希表存储数据的优劣描述错误的是?

正确答案: D   你的答案: C (错误)
哈希表是一个在时间和空间上做出权衡的经典例子。如果没有内存限制,那么可以直接将键作为数组的索引。那么所有的查找时间复杂度为O(1);
线性表实现相对比较简单
平衡二叉树的各项操作的时间复杂度为O(logn)
平衡二叉树的插入节点比较快

哈希表是一个在时间和空间上做出权衡的经典例子。如果没有内存限制,那么可以直接将键作为数组的索引。那么所有的查找时间复杂度为O(1);如果没有时间限制,那么我们可以使用无序数组并进行顺序查找,这样只需要很少的内存。
在平衡二叉树中插入结点要随时保证插入后整棵二叉树是平衡的,所以可能需要通过一次或多次树旋转来重新平衡这个树

基于哈希的索引和基于树的索引有什么区别?

正确答案: A B C D   你的答案: B C D (错误)

hash索引仅满足“=”、“IN”和“<=>”查询,不能使用范围查询
hash索引无法被用来进行数据的排序操作
对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用
Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高

解析:

1、hash索引仅满足“=”、“IN”和“<=>”查询,不能使用范围查询

因为hash索引比较的是经常hash运算之后的hash值,因此只能进行等值的过滤,不能基于范围的查找,因为经过hash算法处理后的hash值的大小关系,并不能保证与处理前的hash大小关系对应。

2、hash索引无法被用来进行数据的排序操作

由于hash索引中存放的都是经过hash计算之后的值,而hash值的大小关系不一定与hash计算之前的值一样,所以数据库无法利用hash索引中的值进行排序操作。

3、对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。

4、Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。

哈希函数越复杂越好,因为这样随机性好,冲突概率小()

正确答案: B   你的答案: B (正确)


解析:哈希函数越复杂,则时间就会越多,因此不是哈希函数越复杂越好,还需要考虑下时间方面
 

用哈希(散列)方法处理冲突(碰撞)时可能出现堆积(聚集)现象,下列选项中,会受堆积现象直接影响的是 ()

正确答案: D   你的答案: C (错误)
存储效率
数列函数
装填(装载)因子
平均查找长度
解析:
装填因子是哈希表可装填的元素个数和表长度的比值,反映哈希表空间的装满程度及表空间的利用效率。装填因子可以在设计哈希表的时候可以设置其值大小,一般来说小于等于1(链地址法可以装填元素数量可以超过哈希表表长,所以链地址法装填因子可大于1)。平均查找长度被闭散列表产生堆积所影响。

不定项选择题]

下列哪两个数据结构,同时具有较高的查找和删除性能?()
有序数组
有序链表
AVL树
Hash表

解析:几种常见的数据结构的操作性能对比如下图所示

由上图可见,平衡二叉树的查找,插入和删除性能都是O(logN),其中查找和删除性能较好;哈希表的查找、插入和删除性能都是O(1),都是最好的。

答案:CD

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangchuang2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值