哈希表
6. 随机数法
选择一个随机函数,取关键字的随机函数值
为它的哈希地址,即H(key)=random (key),其中
random为随机函数。
通常,当关键字长度不等时采用此法构造哈
希函数较恰当。
实际工作中需视不同情况采用不同的哈希函数。通
常考虑的因素:
(1)计算哈希函数所需时间(包括硬件指令的因
素 );
H(84)=(6+2) mod 19=8 H(14)=14 mod 13=1 (冲突) H(27)=27 mod 13=1(冲突) H(14)=(1+1) mod 19=2 H(55)=55 mod 13=3 H(20)=20 mod 13=7 H(27)=(1+1) mod 19=2 (冲突) H(27)=(1+2) mod 19=3 (冲突) H(27)=(1+3) mod 19=4 ……
找单链表中第一个结点的次数为1,第二个结点
次数为2,其余依次类推。
平均查找长度: ASL=1+α/2
例:给定关键字序列 {11,78,10,1,3,2,4,
21},试分别用顺序查找、二分查找、二叉排序树
查找、平衡二叉树查找、哈希查找(用线性探查法 和拉链法)来实现查找,试画出它们的对应存储形 式(顺序查找的顺序表,二分查找的判定树,二叉 排序树查找的二叉排序树及平衡二叉树查找的平
① 构造好的哈希函数,使冲突尽可能的少 ② 设计有效的解决冲突的方法
1.2 哈希函数的构造方法
1.直接定址法
取关键字或关键字的某个线性函数值为散列地址,即 (K)=K 或 H(K)=a * K + b(其中a、b为常数)。
例:关键码集合为{ 100,300,500,700,800,900 }, 选取哈希函数为 Hash(key)=key/100,则存储结构(哈希 表)如下: 0 1 2 3 4 5 6 7 8 9
例 关键码集为 {47,7,29,11,16,92,22,8,3},
设:哈希表表长为m=11;
哈希函数为Hash(key)=key mod 11; 拟用线性探测法处理冲突。建哈希表:
0
1
2
3
4
5
6
3
7
7
8
29
9
8
10
11 22
47 92 16
线性探测法的优点:只要哈希表未被填满,保证 能找到一个空地址单元存放有冲突的元素; 线性探测法的缺点:可能使第i 个哈希地址的同 义词存入第i+1 个哈希地址,这样本应存入 第i+1个哈希地址的元素变成了第i+2个哈希 地址的同义词,……,
二分查找的判定树(中序序列为从小到大排列的 有序序列)
4
2
11
1
3
10
21
78
由图可得:二分查找的成功平均查找长度为
ASL=(1+2*2+3*4+4)/8=2.625
二叉排序树(关键字顺序已确定,该二叉排序树应唯一) 如图(a)所示,平衡二叉树(关键字顺序已确定,该平衡二 叉树也应该是唯一的),如图(b)所示。
因此,可能出现很多元素在相邻的哈希地址 上“堆积”起来,大大降低了查找效率。 可采用二次探测法或伪随机探测法,以改善 “堆积”问题。
1.开放地址法
(2)二次探测法 二次探测法对应的探查地址序列的计算公式为:
Hi = ( H(k)+di ) mod m
其中di =12,-12,22,-22,…,j2,-j2 (j≤m/2)。
(2)关键字的长度;
(3)哈希表的大小;
(4)关键字的分布情况; (5)记录的查找频率。
1.3 处理冲突的方法
1.开放地址法
开放地址就是表中尚未被占用的地址,当新插入的记
录所选地址已被占用时,即转而寻找其它尚开放的地址。
(1)线性探测法 设散列函数 H(K)=K mod m (m为表长),若发生 冲突,则沿着一个探查序列逐个探查,那么,第i次计算 冲突的散列地址为: Hi=(H(K)+di) mod m (di=1,2,…,m-1)
衡二叉树,两种哈希查找的哈希表 ),并求出每一
种查找的成功平均查找长度。设哈希函数为: H(k)=k mod 11,哈希表表长m=11。
顺序查找的顺序表(一维数组)
0 1 2 3 1 4 3 5 2 6 7 8 9 10 11 78 10 4 21
由图可得:顺序查找的成功平均查找长度为
ASL=(1+2+3+4+5+6+7+8)/8=4.5
序号 H(K) 1 1 2 2 5 3 4 9 11 5 6 7 8 21 9 10 27
13 16
2.冲突 两个不同的关键字具有相同的存储位置。
序号 H(K) 1 1 2 5 3 4 9 5 6 7 8 21 9 10 27
13 16
2
11
3.哈希表
根据设定的哈希函数 H(key) 和处理冲突的方
法将一组关键字映象到一个有限的连续的地址集
(区间)上,并以关键字在地址集中的“象”作
为记录在表中的存储位置,这种表便称为哈希表, 这一映象过程称为哈希造表或散列,所得存储位 置称为哈希地址或散列地址。
在哈希存储中,若发生冲突,则必须采取特殊的方法
来解决冲突问题,才能使哈希查找能顺利进行。虽然冲突 不可避免,但发生冲突的可能性却与三个方面因素有关。
11 22
(j≤m/2) 9 10
8
2
3
3
4
5
6
7
7
8
29
47 92 16
若di=伪随机序列,就称为伪随机探测法
2.链地址法
基本思想: 将具有相同哈希地址的记录链成一个单链表,
m个哈希地址就设 m个单链表,然后用一个数组
将m个单链表的表头指针存储起来,形成一个动
态的结构。
优点:插入、删除方便。
缺点:占用存储空间多。
(1)装填因子α; 装填因子是指哈希表中己存入的元素个数 n 与哈希 表的大小 m 的比值,即α=n/m(α<=1)。 α越小,发生冲突的可能性越小,反之,发生冲突的 可能性就越大。但是,α太小又会造成大量存贮空间的浪 费,因此必须兼顾存储空间和冲突两个方面。
(2)所构造的哈希函数;
(3)解决冲突的方法。
例:设有一组关键字{ 19, 01, 23, 14, 55, 20,
84, 27, 68, 11, 10, 77 } ,采用哈希函数为:
H(k)=k mod 13。采用开放地址的线性探测法解
决冲突,试在0~18的散列地址空间中,对该关键 字序列构造哈希表。 解:依题意 m=19,得到线性探测法对应的探查地
100 300 500 700 800 900
优点:以关键码 key 的某个线性函数值为哈希地址,不会 产生冲突。 缺点:要占用连续地址空间,空间效率低。
2.除后余数法
取关键字被不大于散列表表长 m 的数 p 除后所得的 余数为哈希函数。即 H(K)=K mod p (p≤m) 经验得知:一般可选 p 为质数或不包含小于 20 的质因 素的合数。
7
8 10
3.再哈希法 Hi= RHi(key) RHi 均是不同的哈希函数,即在同义词产生 地址冲突时计算另一个哈希函数地址,直到冲突
不再发生。不易产生“聚集”,但是增加了计算
时间。 4.建立一个公共溢出区
1.4 哈希表的查找及其分析
散列表的目的主要是用于快速查找。 在建表时采用何种散列函数及何种解决冲 突的办法,在查找时,也采用同样的散列函数 及解决冲突的办法。
^ ^ ^ ^ ^
10 21 ^
由图可得:链地址法的成功平均查找长度为
ASL=(1*6+2*2)/8=1.25
小结
1. 掌握查找的基本概念; 2. 熟练掌握静态查找表的查找算法思想并灵 活应用; 3. 熟练掌握动态查找表的特点以及二叉排序 树、平衡二叉树的各种操作思想 4. 了解B-、B+树的概念及插入和删除操作; 5. 熟练掌握哈希表的基本概念、哈希函数的 构造方法和解决冲突的方法,并能计算平均查找 长度。
址序列计算公式为:
di=(H(k)+j) mod 19; j=1,2,……,18
其计算函数如下:
{19,01,23,14,55,20,84,27,68,11,10,77}
H(19)=19 mod 13=6 H(01)=01 mod 13=1 H(23)=23 mod 13=10 H(84)=84 mod 13=6 (冲突) H(84)=(6+1) mod 19=7 (冲突)
3.平方取中法
取关键字平方后的中间几位为哈希函数。因为中间几 位与数据的每一位都相关。
例:2589的平方值为6702921,可以取中间的029为地址。
4.数字分析法
选用关键字的某几位组合成哈希地址。 选用原则应当是:各种符号在该位上出现的频率大致相同。 例:有一组(例如80个)关键码,其样式如下: 讨论: 3 4 7 0 5 2 4 ① 第1、2位均是“3和4”,第3位 3 4 9 1 4 8 7 3 4 8 2 6 9 6 也只有“ 7、8、9”,因此,这几 3 4 8 5 2 7 0 位不能用,余下四位分布较均匀, 3 4 8 6 3 0 5 可作为哈希地址选用。 3 4 9 8 0 5 8 ② 若哈希地址取两位(因元素仅80 3 4 7 9 6 7 1 个),则可取这四位中的任意两位组 3 4 7 3 9 1 9 合成哈希地址,也可以取其中两位与 位号:① ② ③ ④ ⑤ ⑥ ⑦ 其它两位叠加求和后,取低两位作哈 希地址。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18