严蔚敏数据结构课件10哈希表.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4. 折叠法 此方法把关键字自左到右分成位数相等的几部分,每 一部分的位数应与散列表地址位数相同,只有最后一 部分的位数可以短一些。 把这些部分的数据叠加起来,就可以得到具有该关键 字的记录的散列地址。 有两种叠加方法: 移位法 — 把各部分的最后一位对齐相加; 分界法 — 各部分不折断,沿各部分的分界来回折叠, 然后对齐相加,将相加的结果当做散列地址。
在应用平方取中法时,若关键字不是整数而是字 符串时,可以把每个字符串转换成整数。
处理冲突的方法
1. 开放定址法(闭散列)——是处理溢出的一种常用的方法 Hash函数: Hi = (H(key)+di) MOD m, i=1,2,…,k(k≤m-1) 其中:H(key)为哈希函数,m为哈希表表长,di为增量序列。 di分别有三种取法: (1) di=1,2,3,…,m-1 线性探测再散列(常考知识点) (2) di=12,-12,22,-22,…, k2, -k2,(k≤m/2) —— 二次探测再散列 特别注意:要求表长m为形如4*j+3的素数 (3) di=伪随机数序列,伪随机探测再散列 说明:
示例:设给定的关键字为 key = 23938587841,若 存储空间限定 3 位, 则划分结果为每段 3 位. 上 述关键字可划分为 4段:
239
385
878
41
把超出地址位数的最高位删去, 仅保留最低的3位, 做为可用的散列地址。
一般当关键字的位数很多,而且关键字每一位上 数字的分布大致比较均匀时,可用这种方法得到 散列地址。
查找关键字时所需对桶的平均访问次数
从图中可以看出,链地址法优于开放定址法;在散列函 数中,用除留余数法作散列函数优于其它类型的散列函 数,最差的是折叠法。
用不同的方法溢出处理冲突时散列表的平均查找长度 如图所示
处 理 溢 出 的 方 法 开 放 定 址 法 伪随机探查法 二次探查法 双散列法 链 地 址 法 (同义词子表法)
哈希函数的构造方法
构造散列函数时的几点要求: 散列函数的定义域必须包括需要存储的全部关 键码,如果散列表允许有m个地址时,其值域必 须在 0 到 m-1 之间。 散列函数计算出来的地址应能均匀分布在整个 地址空间中:若 key是从关键字集合中随机抽 取的一个关键字,散列函数应能以同等概率取 0到 m-1 中的每一个值。 散列函数应是简单的,能在较短的时间内计算 出结果。
0.90 链地 开放 址法 定址法 1.45 310.14 1.38 1.40 1.55 1.52 1.45 22.42 710.01 69.63 89.20 5.50
0.95 链地 开放 址法 定址法 1.47 310.53 1.41 1.51 1.51 1.52 1.48 25.79 118.57 910.56 125.59 10.50
各种方法处理溢出时的平均查找长度
5. 除留余数法
设散列表中允许的地址数为m,取一个不大于m,但最 接近于或等于m的质数p,或选取一个不小于20的质因 数的合数作为除数,利用以下公式把关键字转换成 散列地址。散列函数为: hash ( key ) = key % p p m 其中, “%”是整数除法取余的运算,要求这时的质数p 不是接近2的幂。 示例:有一个关键字 key = 962148,散列表大小 m = 25,即 HT[25]。取质数 p= 23。散列函数 hash ( key ) = key % p。则散列地址为:
3. 平方取中法 此方法在词典处理中使用十分广泛。它先计算构成关键字 的标识符的内码的平方,然后按照散列表的大小取中间 的若干位作为散列地址。 设标识符可以用一个计算机字长的内码表示。因为内 码平方数的中间几位一般是由标识符所有字符决定, 所以对不同的标识符计算出的散列地址大多不相同, 即使其中有些字符相同。 在平方取中法中,一般取散列地址为2的某次幂。例 如,若散列地址总数取为m = 2r,则对内码的平方数 取中间的r位。如果r = 9,所取得的散列地址参看 图的最右一列。(表参见教材255页9.23)
如果Hi>m,则Hi= Hi- m*n; 其中n为整数 如果Hi<0, 则Hi= Hi+ m*n; 其中n为整数
线性探测再散列演示。Hash(key)=key MOD 13
2. 再哈希法(也称双散列法)
Hi = R Hi (key)
3. 链地址法—开散列方法
将所有关键字为同义词的记录存储在同一线性 表中。
示例——P258例9-3
=n/m 散列函数 种类 平方取中 除留余数 移位折叠 分界折叠 数字分析 理论值
0.50 链地 开放 址法 定址法 1.26 1.73 1.19 1.33 1.39 1.35 1.25 4.52 21.75 22.97 4.55 1.50
0.75 链地 开放定 址法 址法 1.40 9.75 1.31 1.48 1.57 1.49 1.37 10.20 65.10 48.70 30.62 2.50
9 4 2 1 4 8 9 4 1 2 6 9 9 4 0 5 2 7 9 4 1 6 3 0 9 4 1 8 0 5 9 4 1 5 5 8 9 4 2 0 4 7 9 4 0 0 0 1 ① ② ③ ④ ⑤ ⑥ 数字分析法仅适用于事先明确知道表中所有关键字每一位数 值的分布情况,它完全依赖于关键字集合。如果换一个关键字集 合,选择哪几位要重新决定。
哈希表的定义
根据设定的哈希函数H(key)和处理冲突的方法将一 组关键字映像到一个有限的连续的地址集(区间)上, 并以关键字在地址集中的“像”作为纪录在表中的存储 位置,这种表便称为哈希表,这一影像过程称为哈希造 表或散列,所得存储位置称哈希地址或散列地址。
散列方法在表项的存储位置与它的关键字之间建立一 个确定的对应函数关系Hash( ),使每个关键字与结构 中一个唯一存储位置相对应: Address = Hash ( Rec.key ) 在查找时,首先对表项的关键字进行函数计算,把函 数值当做表项的存储位置,在结构中按此位置取表项 比较。若关键字相等,则查找成功。在存放表项时, 依相同函数计算存储位置,并按此位置存放。
平 均 搜 索 长 度 ASL 搜索成功 Sn
搜索不成功(登入新记录) Un
( )
线性探查法
1 l oge 1
ห้องสมุดไป่ตู้
e
散列 (Hashing)
在线性表、树结构中查找纪录是通过与关键 字的“比较”完成的。
• 顺序查找,比较的结果为“=”或“≠” • 非顺序查找,比较的结果为“<”,“=”,“>”
散列的思想: 根据纪录的关键字直接找到记录的存储位置, 即为关键字和记录的存储位置建立一个对应 关系f,使每个关键字和结构中一个唯一的 存储位置相对应。 对应关系f为散列函数,按该思想建立的表 为散列表。
hash ( 962148 ) = 962148 % 23 = 12
可以按计算出的地址存放记录。需要注意的是,使用 上面的散列函数计算出来的地址范围是 0到 22,因此, 从23到24这几个散列地址实际上在一开始是不可能用 散列函数计算出来的,只可能在处理溢出时达到这些 地址。
以上介绍了几种常用的散列函数。在实际工作中 应根据关键字的特点,选用适当的方法。有人曾 用“轮盘赌”的统计分析方法对它们进行了模拟 分析,结论是平方取中法最接近于“随机化”。
1. 直接定址法
此类函数直接取关键字或关键字的某个线性函数值 作为散列地址: Hash ( key ) = a * key + b { a, b为常数 } 这类散列函数是一对一的映射,一般不会产生冲突。 但是,它要求散列地址空间的大小与关键字集合的 大小相同。
2. 数字分析法 设有n个d位数,每一位可能有r种不同的符号。这 r 种不同的符号在各位上出现的频率不一定相同,可能 在某些位上分布均匀些;在某些位上分布不均匀,只 有某几种符号经常出现。可根据散列表的大小,选取 其中各种符号分布均匀的若干位作为散列地址。