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

合集下载

哈希表(Hash)的查找

哈希表(Hash)的查找

哈希表(Hash)的查找一、哈希表相关概念1、哈希函数的基本概念哈希表又称散列表。

哈希表存储的基本思想是:以数据表中的每个记录的关键字 k为自变量,通过一种函数H(k)计算出函数值。

把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中。

在此称该函数H为哈希函数或散列函数。

按这种方法建立的表称为哈希表或散列表。

理想情况下,哈希函数在关键字和地址之间建立了一个一一对应关系,从而使得查找只需一次计算即可完成。

由于关键字值的某种随机性,使得这种一一对应关系难以发现或构造。

因而可能会出现不同的关键字对应一个存储地址。

即k1≠k2,但H(k1)=H(k2),这种现象称为冲突。

把这种具有不同关键字值而具有相同哈希地址的对象称“同义词”。

在大多数情况下,冲突是不能完全避免的。

这是因为所有可能的关键字的集合可能比较大,而对应的地址数则可能比较少。

对于哈希技术,主要研究两个问题:(1)如何设计哈希函数以使冲突尽可能少地发生。

(2)发生冲突后如何解决。

2、哈希函数的构造方法常见的构造方法有很多种,如直接定址法,数字分析法,平方取中法等。

接下来,我们介绍其中的几种:(1)除留余数法取关键字k被某个不大于表长m的数p除后所得余数作为哈希函数地址的方法。

即:H(k)=k mod p这种方法的关键是选择好p。

使得数据集合中的每一个关键字通过该函数转化后映射到哈希表的任意地址上的概率相等。

理论研究表明,一般取p为小于m的最大质数或不包含小于20的质因素的合数。

(2)平方取中法先将关键字平方,然后取其中间几位作为散列地址。

所取位数由地址空间范围决定。

若地址空间小于所取位数值决定的范围,可通过乘以一比例因子来解决。

(3)折叠法把关键字分割成位数相等(最后一部分的位数可以不同)的几部分,然后通过折叠后将几部分进行相加,丢掉进位位,所得值即为散列地址。

散列的位数由地址空间的位数而定。

分割方法:从右至左相加方法有两种:移位叠加:将分割后的各部分低位对齐相加。

详解哈希表的查找

详解哈希表的查找

详解哈希表的查找哈希表和哈希函数在记录的存储位置和它的关键字之间是建立一个确定的对应关系(映射函数),使每个关键字和一个存储位置能唯一对应。

这个映射函数称为哈希函数,根据这个原则建立的表称为哈希表(Hash Table),也叫散列表。

以上描述,如果通过数学形式来描述就是:若查找关键字为key,则其值存放在f(key) 的存储位置上。

由此,不需比较便可直接取得所查记录。

注:哈希查找与线性表查找和树表查找最大的区别在于,不用数值比较。

冲突若key1 ≠ key2 ,而f(key1) = f(key2),这种情况称为冲突(Collision)。

根据哈希函数f(key)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这一映射过程称为构造哈希表。

构造哈希表这个场景就像汽车找停车位,如果车位被人占了,只能找空的地方停。

构造哈希表由以上内容可知,哈希查找本身其实不费吹灰之力,问题的关键在于如何构造哈希表和处理冲突。

常见的构造哈希表的方法有 5 种:(1)直接定址法说白了,就是小学时学过的一元一次方程。

即 f(key) = a * key + b。

其中,a和b 是常数。

(2)数字分析法假设关键字是R进制数(如十进制)。

并且哈希表中可能出现的关键字都是事先知道的,则可选取关键字的若干数位组成哈希地址。

选取的原则是使得到的哈希地址尽量避免冲突,即所选数位上的数字尽可能是随机的。

(3)平方取中法取关键字平方后的中间几位为哈希地址。

通常在选定哈希函数时不一定能知道关键字的全部情况,仅取其中的几位为地址不一定合适;而一个数平方后的中间几位数和数的每一位都相关,由此得到的哈希地址随机性更大。

取的位数由表长决定。

(4)除留余数法取关键字被某个不大于哈希表表长 m 的数 p 除后所得的余数为哈希地址。

即f(key) = key % p (p ≤ m)这是一种最简单、最常用的方法,它不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。

查找

查找
查找概率相等,则:
(1)用 顺 序 查 找 确 定 所 在 块:ASLbs

1 b
b j 1
j

1 s
s i 1
i

b1 2
s1 2

1(n 2s

s) 1
(2)用 折 半 查 找 确 定 所 在 块:ASLbs

n log2( s
1)
s 2
2020/1/27
第9章 查找
2020/1/27
第9章 查找
Slide 5 of 17
DS
9.1 静态查找表
抽象数据类型静态查找表的定义 ADT StaticSearchTable{
数据对象D:D是具有相同特性的数据元素的集合 数据关系R:数据元素同属一个集合 基本操作P:
Create(&ST,n); Destroy(&ST); Search(ST,key); Traverse(ST,Visit()); }ADT StaticSearchTable
2020/1/27
第9章 查找
Slide 3 of 17
DS
查找的基本概念
关键字:是数据元素中某个数据项的值,它可以标 识一个数据元素 主关键字:可以唯一标识一个记录的关键字 次关键字:识别若干记录的关键字 查找方法评价
查找速度 占用存储空间多少 算法本身复杂程度 平均查找长度ASL(Average Search Length)
设 表 中 每 个 记 录 的 查 找概 率 相 等pi

1 n
则 :ASL
n i 1
pi ci

1 n
n
ci
i 1

1 n

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

第9章-查找第4讲-哈希表
7/35
3、数字分析法
关键字
92317602 92326875 92739628 92343634 92706816 92774638 92381262 92394220
希 地 址
位 作 为 哈
取 最 后 两
02 75 28 34 16 38 62 20
哈希地址的集合为(2,75,28,34,16,38,62,20)。
77
54 16 43 31 29 46 60 74 88
90
共探查2次 哈希表创建完毕
17/35
成功查找的情况
查找关键字为29的记录:
h(29)=29%13=3:16≠29; d0=3,d1=(3+1)=4:43≠29; d2=(4+1)=5:31≠29; d3=(5+1)=6:29=29。成功!
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
54 16 43 31
46 60 74
90
注意:存在哈希冲突。
解:n=11,m=13,设计除留余数法的哈希函数为: h(k)=k mod p p应为小于等于m的素数,设p=13。
1、哈希表适合情况
某种函数关系 存储地址=h(key)
存储地 址
注意:哈希表是一种存储结构,它并非适合任何情况,主要适 合记录的关键字与存储地址存在某种函数关系的数据。
1/35
示例
学号 姓名
201001001 张三 201001003 李四 … 201001025 王五
记录数n=20,无序

数据结构 第九章 查找-哈希表

数据结构 第九章 查找-哈希表

冲突是很难避免的, 冲突是很难避免的,其不可避免性具有它一 定的内因。 定的内因。因为关键字的值域往往比哈希表的个 数大的多,所以哈希函数是一种压缩映射, 数大的多,所以哈希函数是一种压缩映射,碰撞 是难免的。 是难免的。 例如,存储100个学生记录,尽管安排 个学生记录, 例如,存储 个学生记录 尽管安排120 个地址空间,要找到一个哈希函数把100个任意 个地址空间,要找到一个哈希函数把100个任意 的学生名映射成[0…119]内的不同整数,实际上 内的不同整数, 的学生名映射成 内的不同整数 是不可能的。 是不可能的。 问题在于一旦发生了冲突应如何处理? 问题在于一旦发生了冲突应如何处理?
解决冲突的主要方法 :
(1)开放地址法 (1)开放地址法 为了便于发现冲突和溢出, 为了便于发现冲突和溢出,首先要对哈希表 HT[0…m-1]进行初始化,置表中每个位置为 进行初始化, 进行初始化 置表中每个位置为NULL。就 。 关键字而言, 关键字而言,它表示不属于关键字值域的一种特定的特 殊符号。 殊符号。 假定记录Ri和 的关键字分别为 的关键字分别为Ki和 , 假定记录 和Rj的关键字分别为 和Kj,而有 H[Ki]=H[Kj]=t时,则说发生了冲突。如果 已装入 时 则说发生了冲突。如果Ri已装入 HT[t]中,那么 就不能再装入 那么Rj就不能再装入 中 那么 就不能再装入HT[t]中,但只要 中还 中 但只要HT中还 有空位,总可以把Ri存入 存入HT[t]的“下一个”空位上。 有空位,总可以把 存入 的 下一个”空位上。 寻找“下一个”空位的过程称为探测 探测。 寻找“下一个”空位的过程称为探测。下面介绍两种探 测方法。 测方法。
哈希函数的构造方法回顾
(1)直接定址法 (1)直接定址法 (2)平方取中法 (2)平方取中法 (3)数字分析法 (3)数字分析法 (4)除留余数法 (4)除留余数法

数据结构九章节查找

数据结构九章节查找

9.3 动态查找表
二叉排序树中序遍历 中序遍历二叉排序树,可得到一个关键字的有序序列,如 5,13,19,21,37,56,64,92,75,80,88
56 13
5
37
64 92
21
80
19
75
88
中国科大《数据结构》
9-25
9.3 动态查找表
二叉排序树删除 删除二叉排序树中的一个结点后,必须保持二叉排序树的特性:
顺序查找算法 1. 从表中最后一个记录开始 2. 逐个进行记录的关键字和给定值的比较 3. 若某个记录比较相等,则查找成功 4. 若直到第1个记录都比较不等,则查找不成功
9-6
中国科大《数据结构》
9.2 静态查找表
顺序查找算法描述
int Search_Seq(SSTable ST, KeyType key) { // 若查找成功,返回位置
中国科大《数据结构》
9-19
9.3 动态查找表
动态查找表 如果应用问题涉及的数据量很大,而且数据经常发生变化,如
图书馆经常购进图书,每购进新书,需将新书记录插入图书表,对 这类表除了提供前面的介绍的查找外,还要提供动态查找功能: 1. 查找某个“特定”元素是否在表中,若不在,将该元素插入; 2. 查找某个“特定”元素是否在表中,若在,从表中删除; 如何组织动态查找表? 用静态查找方法不能满足要求了。本节介绍几种方法。
找到 21
64
92 无此数
80
19
75
88
找到
例1:在右图二叉排序树中查找关键字值等于37 例2:在右图二叉排序树中查找关键字值等于88 例3:在右图二叉排序树中查找关键字值等于94
中国科大《数据结构》

数据结构 第9章 查找4-哈希表

数据结构 第9章 查找4-哈希表

7、随机数法 Hash(key) = random ( key ) (random为伪随机函数)
适用于:关键字长度不等的情况。造表和查找都很方便。
小结:构造哈希函数的原则:
① ② ③ ④ ⑤ 执行速度(即计算哈希函数所需时间); 关键字的长度; 哈希表的大小; 关键字的分布情况; 查找频率。
三、冲突处理方法
14 H(14)=14%7=0
6个元素用7个 地址应该足够!
1
2
23 9
3
4
39 25 11
5
6
H(25)=25%7=4 H(11)=11%7=4
有冲突!
在哈希查找方法中,冲突是不可能避免的,只能 尽可能减少。
所以,哈希方法必须解决以下两个问题:
1)构造好的哈希函数
(a)所选函数尽可能简单,以便提高转换速度; (b)所选函数对关键码计算出的地址,应在哈希地址集中 大致均匀分布,以减少空间浪费。
讨论:如何进行散列查找?
根据存储时用到的散列函数H(k)表达式,迅即可查到结果! 例如,查找key=9,则访问H(9)=9号地址,若内容为9则成功; 若查不到,应当设法返回一个特殊值,例如空指针或空记录。
缺点:空间效率低!
若干术语
哈希方法 (杂凑法)
选取某个函数,依该函数按关键字计算元素的存储位置, 并按此存放;查找时,由同一个函数对给定值k计算地址, 将k与地址单元中元素关键码进行比较,确定查找是否成 功。
3. 乘余取整法
4. 数字分析法
5. 平方取中法
常用的哈希函数构造方法有:
6. 折叠法
7. 随机数法
1、直接定址法
(a、b为常数) 优点:以关键码key的某个线性函数值为哈希地址, 不会产生冲突. 缺点:要占用连续地址空间,空间效率低。

哈希表

哈希表
12
示例:设给定的关键字为 key = 23938587841,若存储空间限定 3 位, 则 划分结果为每段 3 位. 上述关键字可划分为 4段: 239 385 878 41 把超出地址位数的最高位删去, 仅保留最低 的3位,做为可用的哈希地址。 移 位 法 分 界 法
13
除留余数法
设哈希表中允许的地址数为 m, 取一个不大 于 m,但最接近于或等于 m 的质数 p 作为 除数,利用以下公式把关键字转换成哈希地 址。哈希函数为:
一子集中的关键字互为同义词。
• 同义词通过一个单链表链接起来。各链表的表头
结点组成一个向量。
23
• 示例:给出一组表项关键字{ Burke, Ekers, Broad, Blum, Attlee, Alton, Hecht, Ederly }。哈希函数为: Hash (x)=ord (x)-ord („A‟)。x为首字母。 • 用它计算可得: Hash (Burke) = 1 Hash (Broad) = 1 Hash (Attlee) = 0 Hash (Alton) = 0 Hash (Ekers) = 4 Hash (Blum) = 1 Hash (Hecht) = 7 Hash (Ederly) = 4
5
直接定址法
此类函数取关键字的某个线性函数值作 为哈希地址:
Hash ( key ) = a * key + b
常数 } { a, b为
这类哈希函数是一对一的映射,一般不会产生 冲突。但是,它要求哈希地址空间的大小与关键 字集合的大小相同。实际中可应用情况很少。
6
数字分析法
设有 n 个 d 位数,每一位可能有 r 种不 同的符号。这 r 种不同的符号在各位上出现 的频率不一定相同,可能在某些位上分布均 匀些;在某些位上分布不均匀,只有某几种 符号经常出现。可根据哈希表的大小,选取 其中各种符号分布均匀的若干位作为哈希地 址。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9.4.1 哈希表的基本概念
1、哈希表适合情况
某种函数关系 存储地址=h(key)
存储地 址
注意:哈希表是一种存储结构,它并非适合任何情况,主要适 合记录的关键字与存储地址存在某种函数关系的数据。
1/35
示例
学号 姓名 201001001 张三 201001003 李四 … 201001025 王五
时间复杂度O(1) 3/35
2、几个概念 哈希函数和哈希地址
哈希地址
n个对象
0 h(k)
┇ 存储 空间
m-1
哈希表:长度为 m(m≥n)的连 续内存单元
哈希函数:把关键字为ki的对象存放在相应的哈希地址中
4/35
哈希冲突 对于两个关键字分别为ki和kj(i≠j)的记录,有ki≠kj,
但h(ki)=h(kj)。把这种现象叫做哈希冲突(同义词冲突)。 在哈希表存储结构的存储中,哈希冲突是很难避免
学号 姓名 201001001 张三 201001003 李四 … 201001025 王五
n=20,m=30
存放地址=学号-201001001
0
1
2
24
29


201001001 空闲 201001003 201001025
空闲
表张三空闲李四王五空闲30个元素空间
查找学号为201001025的学生姓名: ① 计算:地址d= 201001025-201001001=24 ② 和24处的学号比较,相等,返回姓名“王五”
并采用线性探查法解决冲突。
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
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
平方探查法是一种较好的处理冲突的方法,可以避免出现 堆积现象。它的缺点是不能探查到哈希表上的所有单元,但至 少能探查到一半单元。
13/35
【例9-10】 假设哈希表长度m=13,采用除留余数法哈
希函数建立如下关键字集合的哈希表: (16,74,60,43,54,90,46,31,29,88,77)。
希 地 址
位 作 为 哈
取 最 后 两
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个关键字。
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
的!!!
5/35
9.4.2 哈希函数构造方法
1、直接定址法 直接定址法是以关键字k本身或关键字加上某个数值常量c 作为哈希地址的方法。直接定址法的哈希函数h(k)为: h(k) = k+c 例如:
h(学号) = 学号-201001001
6/35
2、除留余数法
哈希表存储 空间
01
哈希函数h(k) m-1
非同义词冲突:哈希函数值不相同的两个记录争夺同一 个后继哈希地址 堆积(或聚集)现象。
12/35
(2)平方探查法 平方探查法的数学描述公式为:
d0=h(k) di=(d0± i2) mod m (1≤i≤m-1) 查找的位置依次为:d0、 d0 +1、 d0 -1 、 d0 +4、 d0 -4、 思路:在电影院中找被占用位置的前后空位置!
示例:如果你买了电影票,到电影院时已经开映了,你的位置 被别人占用了,你需要找一个空位置。这就是开放定址法的思路。
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、开放定址法 开放定址法:冲突时找一个新的空闲的哈希地址。
怎么找空闲单元? 实例:晚到电影院找座位的情况就是采用开放定址法。
关键字: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
解: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
记录数n=20,无序
传统存储方法:存放在一个数组中
0
1
201001001 201001003
张三
李四
19
201001025 王五
查找学号为201001025的学生姓名:
从头到尾顺序查找,时间复杂度为O(n)。 若学号有序,二分查找,时间复杂度为O(log2n)。
20个元 素空间
2/35
另一种存储结构:
相关文档
最新文档