一、哈希函数和哈希冲突的基本概念

1.哈希函数:

哈希法又称散列法、杂凑法以及关键字地址计算法等,相应的表成为哈希表。

基本思想:首先在元素的关键字K和元素的位置P之间建立一个对应关系f,使得P=f(K),其中f成为哈希函数。

创建哈希表时,把关键字K的元素直接存入地址为f(K)的单元;

查找关键字K的元素时利用哈希函数计算出该元素的存储位置P=f(K).

2.哈希冲突:

当关键字集合很大时,关键字值不同的元素可能会映像到哈希表的同一地址上,即K1!=K2,但f(K1)=f(K2),这种现象称为hash冲突,实际中冲突是不可避免的,只能通过改进哈希函数的性能来减少冲突。

二、哈希函数的构造方法

哈希函数的构造原则是:函数本身便于计算、计算出来的地址分布均匀(即对任意K,f(K)对应不同地址的概率相等)。

1.数字分析法:

可以从关键如果事先知道关键字集合,并且每个关键字的位数比哈希表的地址码位数多时,可以从关键字中选出分布较均匀的若干位,构成哈希地址。

例如,有80个记录,关键字为8位十进制整数d1d2d3…d7d8,如哈希表长取100,则哈希表的地址空间为:00~99。

假设经过分析,各关键字中 d4和d7的取值分布较均匀,则哈希函数为:h(key)=h(d1d2d3…d7d8)=d4d7。例如,h(81346532)=43,h(81301367)=06。

相反,假设经过分析,各关键字中 d1和d8的取值分布极不均匀, d1 都等于5,d8 都等于2,此时,如果哈希函数为:h(key)=h(d1d2d3…d7d8)=d1d8,

则所有关键字的地址码都是52,显然不可取。

2.平方取中法:

当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。

这是因为:平方后中间几位和关键字中每一位都相关,故不同关键字会以较高的概率产生不同的哈希地址。

例:我们把英文字母在字母表中的位置序号作为该英文字母的内部编码。例如K的内部编码为11,E的内部编码为05,Y的内部编码为25,A的内部编码为01, B的内部编码为02。

由此组成关键字“KEYA”的内部代码为11052501,同理我们可以得到关键字“KYAB”、“AKEY”、“BKEY”的内部编码。之后对关键字进行平方运算后,取出第7到第9位作为该关键字哈希地址,如图8.23所示。

关键字     内部编码       内部编码的平方值           H(k)关键字的哈希地址

KEYA      11050201      122157778355001                      778
KYAB      11250102      126564795010404                      795
AKEY      01110525       001233265775625                     265

BKEY      02110525       004454315775625                     315

3.分段叠加法:

这种方法是按哈希表地址位数将关键字分成位数相等的几部分(最后一部分可以较短),然后将这几部分相加,舍弃最高进位后的结果就是该关键字的哈希地址。

具体方法有折叠法与移位法。移位法是将分割后的每部分低位对齐相加,折叠法是从一端向另一端沿分割界来回折叠(奇数段为正序,偶数段为倒序),然后将各段相加。

例如:key=12360324711202065,哈希表长度为1000,则应把关键字分成4位一段,在此舍去最低的两位65,分别进行移位叠加和折叠叠加,求得哈希地址为105和907

(a)移位叠加              (b) 折叠叠加
       1   2   3                    1   2   3
       6   0   3                    3   0   6
       2   4   7                    2   4   7
       1   1   2                    2   1   1
       0   2   0                    0   2   0
——————               ——————

1   1   0   5                    9   0   7

4.除留余数法:

假设哈希表长为m,p为小于等于m的最大素数,则哈希函数为 h(k)=k  %  p ,其中%为模p取余运算。

例如,已知待散列元素为(18,75,60,43,54,90,46),表长m=10,p=7,则有h(18)=18 % 7=4    h(75)=75 % 7=5    h(60)=60 % 7=4   h(43)=43 % 7=1    h(54)=54 % 7=5    h(90)=90 % 7=6   h(46)=46 % 7=4此时冲突较多。为减少冲突,可取较大的m值和p值,如m=p=13,结果如下:h(18)=18 % 13=5    h(75)=75 % 13=10    h(60)=60 % 13=8    h(43)=43 % 13=4    h(54)=54 % 13=2    h(90)=90 % 13=12   h(46)=46 % 13=7

三、处理冲突的方法

1.开放定址法(再散列法):

基本思想:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。 这种方法有一个通用的再散列函数形式:

Hi=(H(key)+di)% m   i=1,2,…,n

其中H(key)为哈希函数,m 为表长,di称为增量序列。增量序列的取值方式不同,相应的再散列方式也不同。

1.线性探测再散列:

dii=1,2,3,…,m-1         冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。

2.二次探测再散列:

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

3.伪随机探测再散列:

di=伪随机数序列。  具体实现时,应建立一个伪随机数发生器,(如i=(i+p) % m),并给定一个随机数做起点。

4.  示例:

已知哈希表长度m=11,哈希函数为:H(key)= key  %  11,则H(47)=3,H(26)=4,H(60)=5,

假设下一个关键字为69,则H(69)=3,与47冲突。

a): 如果用线性探测再散列处理冲突,下一个哈希地址为H1=(3 + 1)% 11 = 4,仍然冲突,再找下一个哈希地址为H2=(3 + 2)% 11 = 5,还是冲突,继续找下一个哈希地址为H3=(3 + 3)% 11 = 6,此时不再冲突,将69填入5号单元。

0     1     2     3     4     5     6     7     8     9     10

47   26   60   69

b): 如果用二次探测再散列处理冲突,下一个哈希地址为H1=(3 + 12)% 11 = 4,仍然冲突,再找下一个哈希地址为H2=(3 - 12)% 11 = 2,此时不再冲突,将69填入2号单元。

0     1     2     3     4     5     6     7     8     9     10

69   47   26  60

c): 如果用伪随机探测再散列处理冲突,且伪随机数序列为:2,5,9,……..,则下一个哈希地址为H1=(3 + 2)% 11 = 5,仍然冲突,再找下一个哈希地址为H2=(3 + 5)% 11 = 8,此时不再冲突,将69填入8号单元。

0     1     2     3     4     5     6     7     8     9     10

47   26  60                  69

2.再哈希法:

这种方法是同时构造多个不同的哈希函数: Hi=RH1(key)  i=1,2,…,k

当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。

3.拉链法(HashMap的冲突处理方式):

基本思想: 将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。

例如:  已知一组关键字(32,40,36,53,16,46,71,27,42,24,49,64),哈希表长度为13,哈希函数为:H(key)= key % 13,则用链地址法处理冲突的结果如图所示:

位置    Entry 
        0
        1  -->  40 --> 27 --> 53
        2
        3  -->  16 --> 42
        4
        5
        6  -->  32 --> 71

7
        8
        9
        10 -->  36 --> 49
        11 -->  24
        12 -->  64
        
 本例的平均查找长度 ASL=(1*7+2*4+3*1)/13=1.38

4.建立公共溢出区:

这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表
————————————————
版权声明:本文为CSDN博主「Hello_GY」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40803710/article/details/80945617

哈希表冲突及处理冲突的方法(含例子)相关推荐

  1. 哈希表构造与处理冲突方法

    我们知道:哈希表是一个固定大小的数组,数组的每个元素是一个链表(单向或双向)的头指针.如果Key一样,则在一起,如果Key不一样,则不在一起.哈希表的查询是飞快的.因为它不需要从头搜索,它利用Key的 ...

  2. 数据结构:哈希表函数构造和冲突解决方法

    哈希表 哈希函数:记录的存储位置和它的关键字之间建立一个确定的对应关系. 冲突:对不同的关键字可能得到同一哈希地址,这种现象称为冲突. 哈希函数构造方法 1.直接定址法 取关键字或关键字的某个线性函数 ...

  3. leetcode有效的字母异位词--哈希表与Counter(两种方法天差地别)

    水卡第n弹 话不多说,先展示以下我自己的写法 class Solution:def isAnagram(self, s: str, t: str) -> bool:s=collections.C ...

  4. 高级数据结构与算法 | 哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶

    文章目录 哈希 哈希函数 常见的哈希函数 字符串哈希函数 哈希冲突 闭散列的解决方法 开散列的解决方法 负载因子以及增容 对于闭散列 对于开散列结构 具体实现 哈希表(闭散列) 插入 查找 删除 完整 ...

  5. 哈希表及哈希冲突解决办法

    哈希表及哈希冲突解决办法 目录 什么是哈希表? 哈希表的数据结构 哈希冲突 哈希冲突解决办法 1. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直 ...

  6. 哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶

    文章目录 哈希 哈希(散列)函数 常见的哈希函数 字符串哈希函数 哈希冲突 闭散列(开放地址法) 开散列(链地址法/拉链法) 负载因子以及增容 对于闭散列 对于开散列结构 具体实现 哈希表(闭散列) ...

  7. 初窥Java哈希(如何解决Hash冲突)

    目录 一.引言 二.哈希表和哈希冲突概念 1.通过取模运算来建立一个简单的哈希表 2.什么是哈希冲突 3.哈希函数设计原则 4.常见的哈希函数 (1)直接定址法 (2)除留余数法 (3)平方取中法 ( ...

  8. 【数据结构】 哈希表 详解

    目录 1. 概念 引入 2. 冲突 2.1 概念 2.2 避免 2.3 冲突-避免-哈希函数设计 2.4 冲突-避免-负载因子调节(重点) 2.5 冲突-解决 2.5.1 闭散列 2.6 冲突-解决- ...

  9. ds哈希查找—二次探测再散列_大白话之哈希表和哈希算法

    哈希表概念 哈希表(散列表),是基于关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数(哈希函数 ...

  10. 【Java数据结构】Map与Set、搜索树、哈希表

    1.1 概念及场景 1.2 模型 二.Map 的使用 2.1.关于Map的说明 2.2.Map 的常用方法说明 2.3.TreeMap的使用案例 三.Set 的说明 3.1.常见方法说明 3.2.Tr ...

最新文章

  1. php自动到某个时间提醒,2周后,php脚本cron作业将提醒消息发送到特定的电子邮件地址...
  2. 计算公式1!+2!+3!+...+10!的和
  3. 企业网远程协助的小能手
  4. python连接mysql_Python连接MySQL
  5. 测试你的开源 IQ 答案
  6. python基础 ---- 使用pyCharm 调试
  7. java学习(110):日期date类
  8. 计算机网络——访问网站数据传输过程
  9. redis设置密码和其它服务器连接
  10. info matlab,c – 在OpenCV中是否有类似MATLAB的’impixelinfo()’功能?
  11. oracle服务器文件有哪些,Oracle服务器参数文件维护的技巧有哪些呢?
  12. Java开发工具(Eclipse工作空间的基本配置)
  13. mysql 修改字段为主键自增_「MySQL整理」 MySQL语法,如何操作数据表
  14. z3735 android5.1,『Sanghua的暴力美学』intel Z3735e 昂达V819i完全拆解。
  15. regester正则用法_Regester下载
  16. requests爬虫搜狗微信公众号
  17. Android性能测试文章汇总
  18. 双曲线和直线联立公式_谈直线和双曲线的位置关系之(1)联立方程法
  19. 这-96到底是个什么东西?
  20. 珠海云服务器散热器定做,我家云之瞎乱改造(散热+扩存)篇一

热门文章

  1. Java中的jar包下载地址整理
  2. 三维家导入户型镜像怎么使用_三维家设计中如何镜像?
  3. 万象网管2004怎么给自己的会员号加钱
  4. 关于安装低版本DX错误问题 directx 10 1023
  5. 网络工程师职业规划及发展前景
  6. 超音速 启动_使用“超音速亚原子Java”实现企业应用程序现代化的陷阱和陷阱
  7. 本页面上存在错误。Acrobat可能无法正确显示页面。请联系PDF文档的创建者来更正本页面上存在错误
  8. mms彩信发送 java_MMSDemo android彩信发送模块,实现了 的加密 接收,解密查看等功能。 238万源代码下载- www.pudn.com...
  9. Mybatis-plus批量插入
  10. 高通平台死机例子(log不足或无明显错误)