发布时间:2026-03-25 21:53:53 点击量:
HASH GAME - Online Skill Game GET 300
免费在线讲 哈希查找表 主讲人:陈红丽 哈希表(散列表 ) 查找算法的基础—比较、计算 能否通过对关键值的计算,直接得到待查记录的地址? 显然,记录的存放规则和查找规则必须一致。 存放/查找规则:从关键值映射存储位置,称为哈希表函数。 哈希地址:哈希函数值。 哈希表:按哈希表函数值存储数据的查找表。 妙:时间复杂度是O(1)。 哈希查找/存储的问题 难以保证映射关系的一一对应。 关键值的分布--广、散 (如:0,5,15...) 查找表的地址空间--小、密集(如:0,1,2...) 冲突现象:不同关键值的记录,却有相同的哈希地址。 同义词:造成冲突的关键值。 构造好的哈希函数 好的哈希函数(均匀的哈希函数):哈希地址均匀分布在整个地址空间,冲突次数少。 构造哈希函数的方法 折叠法示例 例 设给定的关键字为 : key = ,若存储空间限定 3 位, 则划分结果为每部分 3 位。上述关键码可划分为 4部分: 239 385 878 41 习题:有一关键字为key = 347256198,若表长为1000,请使用移位叠加法和间界叠加法计算哈希地址。 哈希函数的好坏,必须结合查找表的情况来分析 好哈希函数的特点: ①计算效率高; ②函数值不越界; ③函数值的分布均匀。 一般的哈希函数设计方法 多开辟空间,以减少冲突。 装填因子=表中记录数 / 表长度 一般而言,装填因子越大,冲突可能性大。 出现冲突时,沿一个地址序列逐个探测,直到找出一个空闲空间,将冲突记录存于此处。 H0 = H(key) Hi = ( H0 + di ) MOD m i=1, 2, …, m-1 其中,H (key)为哈希函数,m为哈希表长,di为增量序列。 开放定址法 优点:充分地利用了哈希表的空间 缺点:解决一个冲突,就为下一个冲突埋下了伏笔。 已知一组关键字: 19,14,23,1,67,20,84,27,55,11,10,79 利用除留余数法和线性探测再散列处理冲突方法,构造表长为16的哈希表 ,并写出其构造过程。 2. 再哈希法 方法:构造若干个哈希函数,当地址发生冲突时,就使用下一个哈希函数来计算哈希地址,直到冲突不再产生。即: Hi = RHi (key) i = 1,2,…, k 其中: RHi 是不同的哈希函数。 特点:计算时间增加。 3. 链地址法 方法:将所有关键字为同义词的记录存储在一个单链表中,并用一维数组存放头指针。 4. 建立一个公共溢出区 设哈希函数的值域 (哈希地址) 为 [0, m-1], 则分配两个表: 一个基本表 HashTable[0..m-1]:每个单元只能存放一个元素; 一个溢出表OverTable[0..v]:所有关键字和基本表中关键字为同义词的记录,不管它们的哈希地址是什么,一旦发生冲突,都填入溢出表。 在对哈希表进行查找时,对给定值 K,通过哈希函数计算出哈希地址 i,先与基本表的 HashTable[ i ] 单元比较,若相等,查找成功;否则,再到溢出表中进行查找。 Hash表的地址空间为0…5,散列函数为H(key)=key mod 6,采用线依次存入Hash表,那么查找元素3,需要比较 次。 A、1 B、2 C、3 D、4 * 第九章 查找 * 数据结构 一、基本概念 二、哈希函数的构造方法 三、处理冲突的方法 四、哈希表的查找 9.3 哈 希 表 假设有一批关键字序列18,75,60,43,54,90,46,给定哈希函数H(k)=k % 13,存贮区的内存地址从0到15,则可以得到每个关键字的散列地址为: H(18) = 18%13 = 5 H(75) = 75%13 = 10 H(60) = 60%13 = 8 H(43) = 43%13 = 4 H(54) = 54%13 = 2 H(90) = 90%13 = 12 H(46) = 46%13 = 7 于是,根据散列地址,可以将上述7个关键字序列存贮到一个一维数组HT(哈希表或散列表)中,具体表示为: HT 0 1 2 3 4 5 6 7 8 9 10 11 12 54 43 18 46 60 75 90 13 14 15 对数字的关键字可有下列构造方法: 非数字关键字需先对其进行数字化处理 1. 直接定址法 3. 平方取中法 5. 除留余数法 4. 折叠法 6. 随机数法 2. 数字分析法 哈希函数为关键字的线性函数 H(key) = key 或者 H(key) = a ? key + b 1. 直接定址法 这种方法计算特别简单,并且不会发生冲突,但当关键字分布不连续时,会出现很多空闲单元,将会造成大量存贮单元的浪费。此法仅适合于:地址集合的大小 = = 关键字集合的大小 此方法仅适合于: 能预先估计出全体关键字的每一位上各种数字出现的频度。 2. 数字分析法 假设关键字集合中的每个关键字都是由 s 位数字组成 (u1, u2, …, us),分析关键字集中的全体, 并从中提取分布均匀的若干位或它们的组合作为地址,尽可能使关键字具有大的敏感度。 key1: 9 9 3 4 6 5 3 2 key2: 9 9 3 7 2 2 4 2 key3: 9 9 3 8 7 4 3 3 key4: 9 9 3 0 1 3 6 7 key5: 9 9 3 2 2 8 1 7 ...... 例如: 通过对关键字序列分析,发现第4、5、6位的敏感度较大,于是有: H = 465 H = 722 H = 874 H = 013 H = 228 以关键字的平方值的中间几位作为存储地址。求“关键字的平方值” 的目的是“扩大差别” ,同时平方值的中间各位又能受到整个关键字中各位的影响。 3. 平方取中法 关键字 (关键字) 2 函数地址 0100 0 010 000 010 1100 1 210 000 210 1200 1 440 000 440 1160 1 370 400 370 2061 4 310 541 310 利用平方取中法得到散列函数地址 此方法适合于: 关键字中的每一位都有某些数字重复出现频度很高的现象。 4. 折叠法 此方法适合于: 关键字的数字位数特别多。 将关键字分割成若干部分,然后取它们的叠加和(舍掉进位)为哈希地址。 有两种叠加方法: 移位叠加 — 将分割后的每一部分的最低位对齐,然后相加; 间界叠加 — 从一端向另一端沿分割界来回折叠,然后对齐相加。 移位叠加 2 3 9 3 8 5 8 7 8 4 1 1 5 4 3 H(key) = 543 +) 2 3 9 5 8 3 8 7 8 1 4 1 7 1 4 H(key) = 714 +) 间界叠加 移位叠加 3 4 7 2 5 6 1 9 8 8 0 1 H(key) = 801 +) 7 4 3 2 5 6 8 9 1 8 9 0 H(key) = 890 +) 间界叠加 分组: 347 256 198 5. 除留余数法 设定哈希函数为: H(key) = key MOD p 其中,p≤m (表长) 并且 p应为不大于 m 的素数 或是 不含 20 以下的质因子 可以保证哈希地址在有效的地址空间之内。 为什么要对 p 加限制? 例如:给定一组关键字为: 12, 39, 18, 24, 33, 21,若取 p=9, 则他们对应的哈希函数值将为: 3, 3, 0, 6, 6, 3 可见,若 p 中含质因子 3, 则所有含质因子 3 的关键字均映射到“3 的倍数”的地址上,从而增加了“冲突”的可能。 6.随机数法 设定哈希函数为: H(key) = Random(key) 其中,Random 为伪随机函数 通常,此方法用于对长度不等的关键字构造哈希函数。 实际造表时,采用何种构造哈希函数的方法取决于建表的关键字集合的情况(包括关键字的范围和形态),总的原则是使产生冲突的可能性降到尽可能地小。 三、处理冲突的方法 “处理冲突” 的实际含义是: 为产生冲突的地址寻找下一个哈希地址 1. 开放定址法 3. 链地址法 2. 再哈希法 4.建立一个公共溢出区 1. 开放定址法 对增量 di 有三种取法: di 是一组伪随机数列 或者 di=i×H2(key) (又称双散列函数探测) 随机探测再散列 di = 12, -12, 22, -22, …, 平方探测再散列 di = c? i 最简单的情况 c=1 线性探测再散列 哈希函数:H(key)=key mod 13 处理冲突:Hi=(H(key) + di) mod 16 di=1,2….. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 14 1 67 27 55 19 20 84 79 23 11 10 H(55)=3: 冲突,H1=(3+1)MOD16=4 冲突,H2=(3+2)MOD16=5 H(79)=1: 冲突,H1=(1+1)MOD16=2 冲突,H2=(1+2)MOD16=3 冲突,H3=(1+3)MOD16=4 冲突,H4=(1+4)MOD16=5 冲突,H5=(1+5)MOD16=6 冲突,H6=(1+6)MOD16=7 冲突,H7=(1+7)MOD16=8 冲突,H8=(1+8)MOD16=9 H(19)=6 H(14)=1 H(23)=10 H(1)=1: 冲突,H1=(1+1) MOD16=2 H(67)=2 冲突,H1=(2+1)mod 16=3 H(20)=7 H(84)=6 : 冲突,H1=(6+1)MOD16=7 冲突,H2=(6+2)MOD16=8 H(27)=1: 冲突,H1=(1+1)MOD16=2 冲突,H2=(1+2)MOD16=3 冲突,H3=(1+3)MOD16=4 H(11)=11 H(10)=10: 冲突,H1=(10+1)MOD16=11 冲突,H2=(10+2)MOD16=12 19,14,23,1,67,20,84,27,55,11,10,79 定义一维数组:Chain ChainHashi [m] 数组的大小m是哈希地址的数目。每个分量的初始状态都为空指针。凡是哈希地址为 i 的记录都插入到头指针为ChainHashi [ i ]的链表中。 关键字集合 { 19, 01, 23, 14, 55, 68, 11, 82, 36 } 哈希函数为 H(key)=key MOD 7 0 1 2 3 4 5 6 ? 11 19 ? 82 68 ? 55 ? 14 01 36 ? ? 23 ? ASL=(6×1+2×2+3)/9=13/9 一维数组大小为7 查找过程和造表过程一致。假设采用开放定址处理冲突,则查找过程为: 四、哈希表的查找 对于给定值 K,计算哈希地址 i = H(K) 若 r[i] = NULL 则查找不成功 若 r[i].key = K 则查找成功 否则 “求下一地址 Hi” ,直至 r[Hi] = NULL (查找不成功) 或 r[Hi].key = K (查找成功) 为止。 D 3 11 9 10 5 0 1 2 3 4 5 __(4)__的特点是数据结构中元素的存储地址与其关键字之间存在某种映射关系。(4)A.树形存储结构B.链式存储结构 C.索引存储结构D.散列存储结构 D * * * *