当前位置: 首页 > 面试题库 >

请你说一说哈希冲突的解决方法?

龚振濂
2023-03-14
本文向大家介绍请你说一说哈希冲突的解决方法?相关面试题,主要包含被问及请你说一说哈希冲突的解决方法?时的应答技巧和注意事项,需要的朋友参考一下

参考回答:

考察点:hash冲突,数据结构

公司:腾讯

1、开放定址

开放地址法有个非常关键的特征,就是所有输入的元素全部存放在哈希表里,也就是说,位桶的实现是不需要任何的链表来实现的,换句话说,也就是这个哈希表的装载因子不会超过1。它的实现是在插入一个元素的时候,先通过哈希函数进行判断,若是发生哈希冲突,就以当前地址为基准,根据再寻址的方法(探查序列),去寻找下一个地址,若发生冲突再去寻找,直至找到一个为空的地址为止。所以这种方法又称为再散列法。

有几种常用的探查序列的方法:

①线性探查

dii=1,2,3,…,m-1;这种方法的特点是:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。

②二次探查

di=12,-12,22,-22,…,k2,-k2 ( k<=m/2 );这种方法的特点是:冲突发生时,在表的左右进行跳跃式探测,比较灵活。

③ 伪随机探测

di=伪随机数序列;具体实现时,应建立一个伪随机数发生器,(如i=(i+p) % m),生成一个位随机序列,并给定一个随机数做起点,每次去加上这个伪随机数++就可以了。

2、链地址

每个位桶实现的时候,采用链表或者树的数据结构来去存取发生哈希冲突的输入域的关键字,也就是被哈希函数映射到同一个位桶上的关键字。

img

紫色部分即代表哈希表,也称为哈希数组,数组的每个元素都是一个单链表的头节点,链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中,即链接在桶后。

3、公共溢出区

建立一个公共溢出区域,把hash冲突的元素都放在该溢出区里。查找时,如果发现hash表中对应桶里存在其他元素,还需要在公共溢出区里再次进行查找。

4、再hash

再散列法其实很简单,就是再使用哈希函数去散列一个输入的时候,输出是同一个位置就再次散列,直至不发生冲突位置。

缺点:每次冲突都要重新散列,计算时间增加。

 

 类似资料:
  • 本文向大家介绍请你说一下解决hash冲突的方法?相关面试题,主要包含被问及请你说一下解决hash冲突的方法?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 当哈希表关键字集合很大时,关键字值不同的元素可能会映象到哈希表的同一地址上,这样的现象称为哈希冲突。目前常用的解决哈希冲突的方法如下: 开放定址法: 当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。 再

  • 本文向大家介绍请你说一下哈希表是做什么的?另外哈希表的实现原理也说一下相关面试题,主要包含被问及请你说一下哈希表是做什么的?另外哈希表的实现原理也说一下时的应答技巧和注意事项,需要的朋友参考一下 参考回答: Hash表即散列表,其最突出的优点是查找和插入删除具有常数时间的复杂度 其实现原理是:把Key通过一个固定的算法函数即所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结

  • 本文向大家介绍请你说一说测试的常用方法相关面试题,主要包含被问及请你说一说测试的常用方法时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 黑盒测试: 黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需

  • 本文向大家介绍请说说你对promise的理解相关面试题,主要包含被问及请说说你对promise的理解时的应答技巧和注意事项,需要的朋友参考一下 Promise是ES6中对回调的处理方案,用于处理回调过多,形成回调地狱,不直观的问题;Promise可以链式调用,代码直观易操作,并且有, 等语法糖便于操作

  • 本文向大家介绍请你说一下哈夫曼编码?相关面试题,主要包含被问及请你说一下哈夫曼编码?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 哈夫曼编码是哈夫曼树的一种应用,广泛用于数据文件压缩。哈夫曼编码算法用字符在文件中出现的频率来建立使用0,1表示个字符的最优表示方式,其具体算法如下: (1)哈夫曼算法以自底向上的方式构造表示最优前缀码的二叉树T。 (2)算法以|C|个叶结点开始,执行|C|-

  • 本文向大家介绍请你说一说你理解的虚函数和多态?相关面试题,主要包含被问及请你说一说你理解的虚函数和多态?时的应答技巧和注意事项,需要的朋友参考一下 多态的实现主要分为静态多态和动态多态,静态多态主要是重载,在编译的时候就已经确定;动态多态是用虚函数机制实现的,在运行期间动态绑定。举个例子:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写