哈希算法理解

在力扣上遇到一题算法题,要用到哈希函数,就找视频理解了一下

哈希函数基本概念

一般在查找的过程中,是对关键字值之间进行比较,如果不等就移到下一个位置再查找,直到找到为止,那么这个时候我们可以设想,是不是可以不进行关键值的查找就可以找到我想要的记录呢,要想实现这个想法,我们就想能不能在我们待查找的记录的关键字值与它的存储位置建立一个确定的对应关系,那么就查找不用再进行关键字值之间的比较了。
下面来举例说明一下
其中存储地址=
其中学号就是关键字值,那么存储地址=关键字值-32001得到的,那么这个运算就叫做哈希函数
但是关键字值和存储地址值要一一对应的,所以每次不可能就有像上例那样,这么容易的就找到了哈希函数


存储地址=关键字值中的个位数(这是我们构造的哈希函数),哈希表如下:

0
1 5666551 小李
2 5666552 小莉
3
4 5666554 小里
5 5666554 小周
6
由图表知,小里和小周的关键字值是一样的,那么对应的存储地址也应该一样,但是一个位置不可能可以容下2个人,这就会形成冲突了,所以小周会往下找一个位置
定义
根据设定的哈希函数及处理冲突的方法将查找表中各数据元素存储在一段有限的连续空间中,即得哈希表

处理冲突的基本方法

处理冲突是指对于一个待插入哈希表的数据元素,若按给定的哈希函数求得的哈希地址已被占用,则按一定规则求下一哈希地址,如此重复,直到找到一个可用的地址以保存该元素

1、开放地址法:
令H=(H(key)+di)%m,i=1,2.3.4…,m-1,其中H(key)为哈希函数,m为哈希表长,di为增量序列
1、若取di=1,2,3,…,m=1,则称线性探测再散列(常用)
2、若取di=1 ^ 2, -1 ^2 , 2 ^2, -2 ^ 2,…,±k ^2,则称二次探测再散列(常用)
线性探测
在这里插入图片描述
利用取余法,用关键字值对7取余得到哈希地址值,如下图
在这里插入图片描述
这是无冲突的情况!下面就会出现哈希表中取余之后地址冲突问题
在这里插入图片描述
明显看到67取余和18取余都是哈希地址值都为4,所以这个时候就要用到处理冲突的方法了,在得到的哈希地址值上加增量1,得到哈希如下图,
在这里插入图片描述
如果加增量1之后得到的地址值,还是被占用,则依次在原来的哈希地址上加2,加3,一直到地址值没有被占用为止,比如该例中的28:
在这里插入图片描述
二次探测与线性探测的比较!
在这里插入图片描述
利用线性探测得到如下所示:
在这里插入图片描述
这个过程很容易,就不解释了
二次探测处理过程
在这里插入图片描述
在这里插入图片描述
如果这个数模除以11余数正好是有这个空位,就直接放在那个位置,如果那个位置被占用,则执行先在那个位置加1,如果不行,就再加-1,如果位置还是被占用,就再加4,依次类推,相比下来,明显第二种比较次数明显比第一种比较次数明显少了很多。
2、链地址法
将所有按给定的哈希函数求得的哈希地址相同的关键字存储在同一线性链表中,且使链表按关键字有序。
在这里插入图片描述
在这里插入图片描述
将84模除以7=0,就放在哈希表地址为0的位置,下面讨论特殊情况,当2个数地址一样该如何处理:
在这里插入图片描述
如上图所示,18和67模除以7都为4,都要放在哈希表的地址为4的位置上,这样67就要往后面移一个位置,这样18和67就放在了一条链上了,这就叫做链地址法。
3、公共溢出区法
在这里插入图片描述
在这里插入图片描述
7,8,9就为公共溢出区,当18和67冲突时,就把18放在公共溢出区,即7号位置上,如下图所示:
在这里插入图片描述

在哈希表中如何查找元素

1、根据待查关键字值,按给定的哈希函数,求哈希地址
2、若该地址上无数据元素,则查找失败
3、若该地址上有数据元素,则进行关键字值间的比较
若相等,则查找成功
若不等,则按冲突处理方法求下一可能的存储地址

发布了9 篇原创文章 · 获赞 9 · 访问量 229

猜你喜欢

转载自blog.csdn.net/qq_44231964/article/details/103898484