第9章-查找第4讲-哈希表

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9.4.1 哈希表的基本概念
1、哈希表适合情况
某种函数关系 存储地址=h(key)
存储地 址
注意:哈希表是一种存储结构,它并非适合任何情况,主要适 合记录的关键字与存储地址存在某种函数关系的数据。
1/35
示例
学号 姓名 201001001 张三 201001003 李四 … 201001025 王五
非同义词冲突:哈希函数值不相同的两个记录争夺同一 个后继哈希地址 堆积(或聚集)现象。
12/35
(2)平方探查法 平方探查法的数学描述公式为:
d0=h(k) di=(d0± i2) mod m (1≤i≤m-1) 查找的位置依次为:d0、 d0 +1、 d0 -1 、 d0 +4、 d0 -4、 思路:在电影院中找被占用位置的前后空位置!
77
54 16 43 31 29 46 60 74
90
共探查4次
15/35
关键字:16 74 60 43 54 90 46 31 29 88 77 h(88)=10
0 1 2 3 4 5 6 7 8 9 10 11 12
77
54 16 43 31 29 46 60 74 88
90
共探查1次
16/35
记录数n=20,无序
传统存储方法:存放在一个数组中
0
1
201001001 201001003
张三
李四
19
201001025 王五
查找学号为201001025的学生姓名:
从头到尾顺序查找,时间复杂度为O(n)。 若学号有序,二分查找,时间复杂度为O(log2n)。
20个元 素空间
2/35
另一种存储结构:
学号 姓名 201001001 张三 201001003 李四 … 201001025 王五
n=20,m=30
存放地址=学号-201001001
0
1
2
24
29


201001001 空闲 201001003 201001025
空闲

张三
空闲
李四
王五
空闲
30个元素空间
查找学号为201001025的学生姓名: ① 计算:地址d= 201001025-201001001=24 ② 和24处的学号比较,相等,返回姓名“王五”
的!!!
5/35
9.4.2 哈希函数构造方法
1、直接定址法 直接定址法是以关键字k本身或关键字加上某个数值常量c 作为哈希地址的方法。直接定址法的哈希函数h(k)为: h(k) = k+c 例如:
h(学号) = 学号-201001001
6/35
2、除留余数法
哈希表存储 空间
01
哈希函数h(k) m-1
时间复杂度O(1) 3/35
2、几个概念 哈希函数和哈希地址
哈希地址
n个对象
0 h(k)
┇ 存储 空间
m-1
哈希表:长度为 m(m≥n)的连 续内存单元
哈希函数:把关键字为ki的对象存放在相应的哈希地址中
Biblioteka Baidu
4/35
哈希冲突 对于两个关键字分别为ki和kj(i≠j)的记录,有ki≠kj,
但h(ki)=h(kj)。把这种现象叫做哈希冲突(同义词冲突)。 在哈希表存储结构的存储中,哈希冲突是很难避免
m个单元:空间为0~m-1
除留余数法的哈希函数h(k)为: h(k)=k mod p (mod为求余运算,p≤m)
p最好是质数(素数)。 讲解:除留余数法就是把n个记录按关键字映射的0~m-1 的哈希空间中。而模p(素数)时出现冲突的可能性更小。
7/35
3、数字分析法
关键字
92317602 92326875 92739628 92343634 92706816 92774638 92381262 92394220
关键字:16 74 60 43 54 90 46 31 29 88 77
h(77)=12
冲突
d0=12,d1=(12+1) % 13=0 OK
0 1 2 3 4 5 6 7 8 9 10 11 12
77
54 16 43 31 29 46 60 74 88
希 地 址
位 作 为 哈
取 最 后 两
02 75 28 34 16 38 62 20
哈希地址的集合为(2,75,28,34,16,38,62,20)。
大数值范围
哈希函数h(k)
小数值范围 8/35
【例9-9】 假设哈希表长度m=13,采用除留余数法哈希
函数建立如下关键字集合的哈希表(16,74,60,43,54, 90,46,31,29,88,77),共11个关键字。
并采用线性探查法解决冲突。
14/35
关键字:16 74 60 43 54 90 46 31 29 88 77
h(29)=3
d0=3,d1=(3+1) % 13=4 d2=(4+1) % 13=5 d3=(5+1) % 13=6
冲突 仍冲突 仍冲突 OK
0 1 2 3 4 5 6 7 8 9 10 11 12
平方探查法是一种较好的处理冲突的方法,可以避免出现 堆积现象。它的缺点是不能探查到哈希表上的所有单元,但至 少能探查到一半单元。
13/35
【例9-10】 假设哈希表长度m=13,采用除留余数法哈
希函数建立如下关键字集合的哈希表: (16,74,60,43,54,90,46,31,29,88,77)。
示例:如果你买了电影票,到电影院时已经开映了,你的位置 被别人占用了,你需要找一个空位置。这就是开放定址法的思路。
11/35
(1)线性探查法 线性探查法的数学递推描述公式为:
d0=h(k) di=(di-1+1) mod m (1≤i≤m-1)
示例:在电影院中找被占用位置的后面空位置!模m是为 了保证找到的位置在0~m-1的有效空间中。
54 16 43 31
46 60 74
90
注意:存在哈希冲突。
解:n=11,m=13,设计除留余数法的哈希函数为: h(k)=k mod p
p应为小于等于m的素数,设p=13。
10/35
9.4.3 哈希冲突解决方法
1、开放定址法 开放定址法:冲突时找一个新的空闲的哈希地址。
怎么找空闲单元? 实例:晚到电影院找座位的情况就是采用开放定址法。
解:n=11,m=13,设计除留余数法的哈希函数为: h(k)=k mod p
p应为小于等于m的素数,设p=13。
9/35
关键字:16 74 60 43 54 90 46 31 29 88 77
hh((917645320640319))==139842752
0 1 2 3 4 5 6 7 8 9 10 11 12
相关文档
最新文档