• 除法散列法
  • 乘法散列法
  • 全域散列法

冲突解决办法

  • 拉链法
  • 开放寻址法
  • 线性探查
  • 二次探查
  • 双重散列

但是很明显的是,当全域特别大的时候,这意味着我们要创建一个内容特别大的数组,如果关键字较少则会造成空间的浪费,于是我们想出了使用散列表,控制数组的长度,通过使用散列函数(除法散列法、乘法散列法、全域散列法等),找出关键字对应到各自相应的槽,也就是说,如果我们能够平均的分配关键字到相应的槽,避免冲突,则可以实现直接寻址技术一样的效果,同时还大大的减少了内存。

理想情况下,冲突可以完全避免,但是现实中,我们可以通过散列函数尽量的避免冲突,尽可能的使其随机化,同时还是会不可避免的发生冲突,此时我们还可以通过拉链法或者开放寻址法来解决冲突。

哈希表总结

缺点:需要额外的指针空间。

开放寻址法包括几种方法:线性探查,二次探查,双重探查;

  1. 线性探查

    顾名思义,其是一个线性递增的过程,如果当前发生冲突,则会递增的找下一个,如果最后一个仍然找不到,那么则又会从头开始查找,以此类推。但是这会存在一个问题,叫做一次群集,随着连续被占用的槽增加,那么它查找的时间也会不断的增加。

    哈希表总结
  2. 二次群集

    和之前不同的是,在开始的槽的位置上发生冲突以后,其不再是线性的递增,而是通过一个偏移量(1,2,3...的二次方地址处),这在一定程度下缓解了基本群集的问题,但是依旧存在问题,比如在具有相同偏移量的位置发生冲突,那么就和之前的一样,槽会发生连续被占用的情况,甚至是该相对偏移量下的所有槽都被占用情况,此时再使用偏移量则会找不到空白的槽。

    key1:hash(key)+0
    key2:hash(key)+1^2
    key3:hash(key)+2^2
  3. 双重探测

    这可能是最好的方法之一,因为它不再像是线性和二次固定的增加偏移,而是会变化的去寻找下一个位置。即下一个探测的位置以关键字的另一个散列函数值作为增量。其公式为:

    h(k, i) = (h1(k) + ih2(k)) mod m

相关文章:

  • 2022-12-23
  • 2021-11-04
  • 2021-08-06
  • 2022-12-23
  • 2021-05-12
  • 2021-08-09
  • 2022-01-26
  • 2022-01-18
猜你喜欢
  • 2021-05-14
  • 2021-06-28
  • 2022-12-23
  • 2021-07-16
  • 2021-05-05
  • 2021-10-01
  • 2022-12-23
相关资源
相似解决方案