HASH表(散列查找)

hash(散列)查找

作用

不用比较就能直接计算出记录的存储地址。(比之前的比较次数要少很多。)

定义

根据设定的散列函数和相应解决冲突的方法为一组结点建立的一张表,表中的结点的存储位置依赖设定的散

列函数和处理冲突的方法。

基本思想

以结点的关键值k为自变量,通过一定的函数惯性系h计算出对应的函数值h(k),把这个值解释为及诶单那

的存储地址(散列地址),将这个值存储到地址中。

哈希冲突的概念

对于不同值k1、k2,k1!=k2,但是h(k1)=h(k2),即具有相同的散列地址。这种现象叫哈希冲突

例如:
HASH表(散列查找)_第1张图片
因为需要对表中的数据进行增、删、改、查,所以不能按实际长度来约束表长。

表长的选取

n/m=3/4.

m:hash表的表长。

n:hash表中关键字的个数。

hash函数的构造方法:

(1)直接定址法(限于:地址集合的大小=关键字集合的大小)

线性函数

H(key)=key或者H(key)=a*key+b.

(2)数据分析法(能余弦估计出全体关键字的每一位上各种数字出现的频度。)

假设关键字集合中的每个关键字都是由s为数字组(k1,k2,…,kn),分析关键字集中的全体,并从中提取分布

均匀的若干位或他们的组合作为地址。

(3)平方取中法

如果每一位都有某些数字重复出现频度很高的现象,则先求出关键字的平方,通过平方来扩大差别,同时平

方值的中间几位受到整个关键字中各位的影响。

地址取的位数由表长决定。

(4)折叠法

将关键字分割成位数相同的几部分,然后取这几部分的叠加和作为哈希地址。进位数值全部舍去。

(5)除留余数法

选择一个适当的正整数p,用p去除关键值,取余数作为散列地址。
在这里插入图片描述
这个p一般为小于等于表长度的最大素数。(p越大,冲突可能性越小)

存储方法:挨个取出线性表中的每一个元素,然后去除p,得到的余数就是在线性表中的存放地址。

例如:
HASH表(散列查找)_第2张图片
(6)随机数法

H(key)=Random(key)

选取哈希函数的考虑因素:

(1)需要使发生冲突的可能性足够小。

(2)计算哈希函数的效率。

(3)关键字的长度。

(4)哈希表的大小。

(5)关键字的公布情况。

(6)记录的查找频率。

解决冲突的办法

1、链地址法

将关键字相同(具有相同散列地址)的记录都存储在同一个线性链表中。
HASH表(散列查找)_第3张图片
余数相同的关键字组成一个单链表,将单链表的头指针存放在对应余数的数组中。

查找:

先算出要查找的地址,然后从链表中逐个查找目标数值。

插入:

也是算出插入的地址,然后从单链表中插入。

ASL:平均查找长度。

平均查找长度:查找次数/关键字个数。
HASH表(散列查找)_第4张图片
2、开发定址法

当冲突发生的时候,使用某种方法在散列表中形成一个探查序列,沿着此序列逐个地址去探查,直到找到一

个开发的地址,将冲突的值放进去。

(1)线性探测法
HASH表(散列查找)_第5张图片
当前地址位置被占用,那么依次往后找空闲的空间。直到可以存放的时候放入数值。

示例:
HASH表(散列查找)_第6张图片
查找关键字的比较次数以及平均查找长度:
在这里插入图片描述
**问题:**聚集问题(余数相近的关键值容易聚集,导致后面的数值也会聚集在一块)、删除问题(删除之后不

做移位处理,那么将会有数值空闲出来,那么下一次查找的时候,余数如果是这个空值的话,就会无法继续

查找)。

如果将表长变大:
HASH表(散列查找)_第7张图片
(2)二次探测法

加、减探测,当前位置如果有值,那么+1看是否空闲,-1看是否空闲,+4、-4;+8,-8;…

跳跃探测,减少关键值聚集的状况。
HASH表(散列查找)_第8张图片
(3)再散列探查法
HASH表(散列查找)_第9张图片
(4)公共溢出区法

将散列地址相同的数据放在同一个区域内。(只将第二次出现的数据放入,例如下面的10、79)
HASH表(散列查找)_第10张图片

你可能感兴趣的:(HASH表(散列查找))