• 面试题延伸 之 哈希冲突及四种解决方法


    最近看了布隆去重原理,发现一个词哈希冲突特意去查了下

    参考

    哈希冲突的产生原因

    哈希是通过对数据进行再压缩,提高效率的一种解决方法。但由于通过哈希函数产生的哈希值
    是有限的,而数据可能比较多,导致经过哈希函数处理后仍然有不同的数据对应相同的哈希值。
    这时候就产生了哈希冲突。
    

    产生哈希冲突的影响因素

    装填因子(装填因子=数据总数 / 哈希表长)、哈希函数、处理冲突的方法
    

    解决哈希冲突的四种方法

    1.开放地址方法
    
      (1)线性探测
    
       按顺序决定哈希值时,如果某数据的哈希值已经存在,则在原来哈希值的基础上往后加一个单位,直至不发生哈希冲突。 
    
      (2)再平方探测
    
       按顺序决定哈希值时,如果某数据的哈希值已经存在,则在原来哈希值的基础上先加1的平方个单位,若仍然存在则减1的平方个单位。随之是2的平方,3的平方等等。直至不发生哈希冲突。
    
      (3)伪随机探测
    
       按顺序决定哈希值时,如果某数据已经存在,通过随机函数随机生成一个数,在原来哈希值的基础上加上随机数,直至不发生哈希冲突。
    
    2.链式地址法(HashMap的哈希冲突解决方法)
    
      对于相同的哈希值,使用链表进行连接。使用数组存储每一个链表。
    
      优点:
    
      (1)拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
    
      (2)由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
    
      (3)开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
    
      (4)在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。
      缺点:
    
      指针占用较大空间时,会造成空间浪费,若空间用于增大散列表规模进而提高开放地址法的效率。
    
    3.建立公共溢出区
    
      建立公共溢出区存储所有哈希冲突的数据。
    
    4.再哈希法
    
      对于冲突的哈希值再次进行哈希处理,直至没有哈希冲突。
    
  • 相关阅读:
    模拟登陆并爬取Github
    Python学习--猫眼电影TOP100榜单抓取
    MATLAB拟合和插值
    Python学习--两种方法爬取网页图片(requests/urllib)
    md5码加密(Python)
    【Docker】Dockerfile 之 ENTRYPOINT(三)
    【Docker】Dockerfile 之 ENTRYPOINT(二)
    CSS---选择器种类 | 层叠性权重
    HTML---引入css,js | 常用标签示例
    DB2批量插入性能对比
  • 原文地址:https://www.cnblogs.com/wzbk/p/14119456.html
Copyright © 2020-2023  润新知