zoukankan      html  css  js  c++  java
  • 面试题延伸 之 哈希冲突及四种解决方法

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

    参考

    哈希冲突的产生原因

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

    产生哈希冲突的影响因素

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

    解决哈希冲突的四种方法

    1.开放地址方法
    
      (1)线性探测
    
       按顺序决定哈希值时,如果某数据的哈希值已经存在,则在原来哈希值的基础上往后加一个单位,直至不发生哈希冲突。 
    
      (2)再平方探测
    
       按顺序决定哈希值时,如果某数据的哈希值已经存在,则在原来哈希值的基础上先加1的平方个单位,若仍然存在则减1的平方个单位。随之是2的平方,3的平方等等。直至不发生哈希冲突。
    
      (3)伪随机探测
    
       按顺序决定哈希值时,如果某数据已经存在,通过随机函数随机生成一个数,在原来哈希值的基础上加上随机数,直至不发生哈希冲突。
    
    2.链式地址法(HashMap的哈希冲突解决方法)
    
      对于相同的哈希值,使用链表进行连接。使用数组存储每一个链表。
    
      优点:
    
      (1)拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
    
      (2)由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
    
      (3)开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
    
      (4)在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。
      缺点:
    
      指针占用较大空间时,会造成空间浪费,若空间用于增大散列表规模进而提高开放地址法的效率。
    
    3.建立公共溢出区
    
      建立公共溢出区存储所有哈希冲突的数据。
    
    4.再哈希法
    
      对于冲突的哈希值再次进行哈希处理,直至没有哈希冲突。
    
  • 相关阅读:
    PAT (Advanced Level) 1086. Tree Traversals Again (25)
    PAT (Advanced Level) 1085. Perfect Sequence (25)
    PAT (Advanced Level) 1084. Broken Keyboard (20)
    PAT (Advanced Level) 1083. List Grades (25)
    PAT (Advanced Level) 1082. Read Number in Chinese (25)
    HDU 4513 吉哥系列故事――完美队形II
    POJ Oulipo KMP 模板题
    POJ 3376 Finding Palindromes
    扩展KMP
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/wzbk/p/14119456.html
Copyright © 2011-2022 走看看