【C++】有关哈希的面试题自测

关于哈希结构的介绍可以看这两篇博客:哈希结构的介绍哈希冲突的解决办法

1.关于哈希说法正确的是:

A.哈希是一种查找的方法,不是数据结构

B.采用哈希方式解决问题时,可以不用哈希函数

C.哈希查找的时间复杂度一定是O(1)

D.哈希是以牺牲空间为代价,提高查询的效率

分析:

A:哈希是一种用来进行高效查找的数据结构,查找的时间复杂度为O(1) 。错误

B:哈希之所以高效,是引用使用了哈希函数将元素与其存储位置之间建立了一一对应的关系,因此必须使用哈希函数。错误

C:由于哈希冲突的存在,并不都是O(1)。错误

D:采用哈希处理时,一般所需空间都会比元素个数多,否则产生冲突的概率就比较大,影响哈希的性能。正确

因此:选D

2.散列函数有一个共同性质,即函数值应按()取其值域的每一个值。

A.最大概率

B.最小概率

C.同等概率

D.平均概率

分析:

哈希函数设计原则:

  1. 哈希函数应该尽可能简单

  2. 哈希函数的值域必须在哈希表格的范围之内

  3. 哈希函数的值域应该尽可能均匀分布,即取每个位置应该是等概率

 因此:选C

3.散列文件使用散列函数将记录的关键字值计算转化为记录的存放地址。由于散列函数不是一对一的关系,所以选择好的()方法是散列文件的关键。

A.散列函数

B.除余法中的质数

C.冲突处理

D.散列函数和冲突处理

分析:

好的哈希函数可以减少发生冲突的概率,而好的冲突处理方法也可以较小后序冲突的概率 

因此:选D

4.解决散列法中出现冲突问题常采用的方法是()

A.数字分析法、除余法、平方取中法

B.数字分析法、除余法、线性探测法

C.数字分析法、线性探测法、多重散列法

D.线性探测法、多重散列法、链地址法

分析:

区分:哈希冲突的处理方法 和 哈希函数

哈希函数作用是:建立元素与其存储位置之前的对应关系的,在存储元素时,先通过哈希函数计算元素在哈希表格中的存储位置,然后存储元素。好的哈希函数可以减少冲突的概率,但是不能够绝对避免,万一发生哈希冲突,得需要借助哈希冲突处理方法来解决。

常见的哈希函数有:直接定址法、除留余数法、平方取中法、随机数法、数字分析法、叠加法等

常见哈希冲突处理:闭散列(线性探测、二次探测)、开散列(链地址法)、多次散列

因此:选择D

5.下面关于哈希冲突说法正确的是()

A.哈希冲突是可以通过设计好的哈希函数来杜绝的

B.哈希冲突是无法避免的

C.哈希冲突是不同的元素,通过不同的哈希函数而产生相同的哈希地址而引起的

D.哈希冲突产生的原因一定是插入了相同的元素

分析:

A:哈希冲突是不能杜绝的,这个与存储的元素以及哈希函数相关。错误

B:正确

C:哈希冲突是不同的元素,通过相同的哈希函数而产生相同的哈希地址而引起的。错误

D:不同元素在计算出相同的哈希值时就会冲突。错误

因此:选择B

6.已知有一个关键字序列:(19,14,23,1,68,20,84,27,55,11,10,79)散列存储在一个哈希表中,若散列函数为H(key)=key%7,并采用链地址法来解决冲突,则在等概率情况下查找成功的平均查找长度为()

A.1.5

B.1.7

C.2.0

D.2.3

分析:

先更具给定的散列函数,将关键字按计算出的哈希值插入相应的链表,得到哈希表如下:

0:14 → 84

1:1

2:23 → 79

3:10

4:11

5:19 → 68

6:20 → 27 → 55

平均查找长度 L = 各元素查找长度相加(18) /  元素个数(12)= 1.5

因此:选A

7.采用线性探测法处理散列时的冲突,当从哈希表删除一个记录时,不应将这个记录的所在位置置空,因为这会影响以后的查找() 

A.对

B.错

C.不一定

D.以上说法都不对

分析:

线性探测采用伪删除法,当从哈希表中删除某个元素时,并没有将该元素真正的删除掉,而是采用标记的方式处理,并不直接将该位置标记为空,否则会影响从该位置产生冲突的元素的查找。 

因此:选B 

猜你喜欢

转载自blog.csdn.net/dhgiuyawhiudwqha/article/details/143303127