目录
一、哈希表的定义
二、 常用的哈希函数
三、 处理冲突的方法
四、哈希表的查找和性能分析
💟?创作不易,不妨点赞💚评论??收藏💙一下
一、哈希表的定义
1)查找总结
用以上方法表示的查找表,其平均查找长度都不为零。
不同的表示方法,其差别仅在于:关键字和给定值进行比较的顺序不同。
2)哈希函数
-
对于频繁使用的查找表,希望 ASL = 0. (因为key可以确定在表中的位置,ASL就为0) -
只有一个办法:预先知道所查关键字在表中的位置。即记录在表中位置和其关键字之间存在一种确定的关系。 -
在查找时,直接通过关键字获得数据元素的存储位置,此类查找表就是哈希表。
key --> H(key) --> 存储位置
-
key:关键字 -
H :散列函数 或 哈希(Hash)函数 -
存储位置:函数值(哈希地址)
-
哈希表中查找数据元素
63 --> h(63) = 63 % 11 = 8 ,哈希地址为8,从下标为8的存储单元中取出该数据元素即可。
3)哈希冲突
-
哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上。
-
由于哈希函数是一个压缩映象,因此,在一般情况下,很容易产生“冲突”现象,
-
实际上,冲突不可能避免,只能尽可能减少。因此,在构造这种特殊的查找表时,除了需要选择一个“好”(尽可能少产生冲突)的哈希函数之外;还需要找到一种“处理冲突”的方法。
4)哈希表
二、 常用的哈希函数
1)除留余数法
2)直接地址法
3)数字分析法
4)平方取中法
5)折叠法
6)随机数法
7)总结
三、 处理冲突的方法
1)概述
2)开放定址法
-
开放定址法处理冲突的基本思想是,当冲突发生时,形成一个地址序列,沿着这个序列逐个探测,直到找到一个“空”的开放地址,将发生冲突的关键字存放到该地址中。 -
开放定址法的一般形式:Hi = ( H(key) + di ) % m ,(i= 1,2,...,k (k≤m-1) ) -
对增量di有三种取法:
-
线性探测法:di = 1,2, ... , m-1 ,i为探测次数。依次探测下一个地址,直到有空的地址后插入。 -
二次探测法:di = 12,-12,22,-22, ... ,q2,-q2 (q≤m/2) ,左右轮询探测至少一半的存储单元。 -
双哈希函数探测法:Hi=( H(key) + i*RH(key) ) % m (i=1,2, ... , m-1) ,H(key)和RH(key)是两个哈希函数,m为哈希表长度,i为步长因子。使用第一个哈希函数计算哈希地址,如果产生冲突,再使用第二个函数以及步长因子探测空余的哈希地址。
-
实例:关键字集合9个数据元素 {19,01,23,14,55,68,11,82,36} -
实例1:线性探测法
-
实例2:二次探测法
-
关键字6的比较次数
-
68 --> H( % 11) --> 2,占用,比较1次 -
68 --> H ( % 11 + 12 ) --> 3,占用,比较2次 -
68 --> H (% 11 - 12) --> 1,占用,比较3次 -
68 --> H (% 11 + 22) --> 6,未占用,比较4次
-
官架子11的比较次数
-
11 --> H( % 11) --> 0,占用,比较1次 -
11 --> H( % 11+ 12) --> 1,占用,比较2次 -
11 --> H( % 11- 12) --> -1 --> -1+11 --> 10,未占用,比较3次
-
实例3:双哈希函数探测法
-
关键字23比较次数
-
23 --> H( % 11) --> 1, 占用,比较1次 -
23 --> (H(23) + H2(23) ) % 11 --> (1 + 69 %10 + 1) % 11 --> 11 % 11 --> 0,未占用,比较2次
-
关键字36比较次数
-
36 --> H(36) --> 3 , 占用,比较1次 -
36 --> (H(36) + H2(36) ) % 11 --> (3 + 9) % 11 --> 1,占用,比较2次 -
36 --> (H(36) + 2×H2(36) ) % 11 --> (3 + 18) % 11 --> 10,未占用,比较3次
?
3)链地址法
-
链地址法:将所有哈希地址相同的记录都链接在同一链表中。 -
例如:关键字序列{19,01,23,14,55,68,11,82,36},哈希函数设为 H(key) = key MOD 7
ASL成功= Σ(索引号 × 索引个数) / 元素总数? ? ? ?
//找到索引为0的有几个,索引为1的都几个, ...
例如:ASL成功=(1×6 + 2×2 + 3) / 9 = 13/9
ASL失败=元素个数 / 表长
// 不算空表,找完1个仍没有找到,找完2个仍没有找到...
例如:ASL失败=(1×4 + 2 + 3) / 7 = 9 / 7
4)公共溢出区法
-
基本思想是:除基本的存储区(称为基本表)之外,另建一个公共溢出区(称为溢出表) -
当不发生冲突时,数据元素可存入基本表中; -
当发生冲突时,不管哈希地址是什么,数据元素都存入溢出表。 -
查找时,对给定值K通过哈希函数计算出哈希地址i,先与基本表对应的存储单元相比较,若相等,则查询成功;否则,再到溢出表中查找。 -
适用于,冲突的数据很少的情况
5)再哈希法
-
主要思想:当发生冲突时,再用另一个哈希函数来得到一个新的哈希地址,若再发生冲突,则再使用另一个函数,直至不发生冲突为止。 -
预先需要设置一个哈希函数的序列: Hi = RHi(key) (i=1,2,...,k) , RHi 表示不同的哈希函数 -
不易产生聚集,但增加了计算的时间。
四、哈希表的查找和性能分析
1)哈希表的查找
-
查找过程和造表过程一致。 -
假设采用开放地址法处理冲突,则查找过程为:
2)哈希表查找的性能分析
写到最后
四季轮换,已经数不清凋零了多少, 愿我们往后能向心而行,一路招摇胜!
🐋?你的支持认可是我创作的动力
💟?创作不易,不妨点赞💚评论??收藏💙一下
😘?感谢大佬们的支持,欢迎各位前来不吝赐教
|