




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第九章第九章查查 找找何谓查找表何谓查找表 ? 查找表是由同一类型同一类型的数据元素(或记录)构成的集合集合。 由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。对查找表经常进行的对查找表经常进行的操作操作: 1)查询查询某个“特定的”数据元素是否在查找表中; 2)检索检索某个“特定的”数据元素的各种属性; 3)在查找表中插入插入一个数据元素; 4)从查找表中删去删去某个数据元素。仅作查询和检索操作的查找表。静态查找表静态查找表有时在查询之后,还需要将“查询”结果为“不在查找表中”的数据元素插入到查找表中;或者,从查找表中删除其“查询”结果为“在查找表中”的数据元素
2、。动态查找表动态查找表查找表可分为两类查找表可分为两类:是数据元素(或记录)中某个数据项数据项的值,用以标识标识(识别)一个数据元素(或记录)。关键字关键字 若此关键字可以识别唯一的唯一的一个记录,则称之谓“主关键字主关键字”。 若此关键字能识别若干若干记录,则称之谓“次关键字次关键字”。 根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)。 查找查找 若查找表中存在这样一个记录,则称“查找成功查找成功”。查找结果给出整个记录的信息,或指示该记录在查找表中的位置; 否则称“查找不成功查找不成功”。查找结果给出“空记录”或“空指针”。 由于查找表中的数据元素之间不存在明显
3、的组织规律,因此不便于查找。 为了提高查找的效率, 需要在查找表中的元素之间人为地 附加某种确定的关系,换句话说, 用另外一种结构来表示查找表用另外一种结构来表示查找表。如何进行查找?如何进行查找?查找的方法取决于查找表的结构。查找的方法取决于查找表的结构。9.1 静态查找表静态查找表9.2 动态查找树表动态查找树表9.3 哈希表哈希表9.1 静静 态态 查查 找找 表表数据对象数据对象D:数据关系数据关系R:D是具有相同特性的数据元素的集合。每个数每个数据元素含有类型相同的据元素含有类型相同的关键字关键字,可唯一标识数据元素。 数据元素同属一个集合。ADT StaticSearchTable
4、 Create(&ST, n);Destroy(&ST);Search(ST, key);Traverse(ST, Visit();基本操作基本操作 P: ADT StaticSearchTable构造一个含n个数据元素的静态查找表ST。 Create(&ST, n);操作结果:销毁表ST。Destroy(&ST);初始条件:操作结果:静态查找表ST存在;若 ST 中存在其关键字等于 key 的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。 Search(ST, key);初始条件:操作结果:静态查找表ST存在,key 为和查找表中元素的关键字类型相同的给定值;按某种次序对ST的
5、每个元素调用函数Visit()一次且仅一次,一旦Visit()失败,则操作失败。Traverse(ST, Visit();初始条件:操作结果:静态查找表ST存在,Visit是对元素操作的应用函数;typedef struct / 数据元素存储空间基址,建表时 / 按实际长度分配,0号单元留空 int length; / 表的长度 SSTable;假设静态查找表静态查找表的顺序存储结构顺序存储结构为ElemType *elem;数据元素类型的定义为数据元素类型的定义为:typedef struct keyType key; / 关键字域 / 其它属性域 ElemType ; , TElemTyp
6、e ;一、顺序查找表一、顺序查找表二、有序查找表二、有序查找表四、索引顺序表四、索引顺序表 以顺序表或线性链表表示静态查找表一、顺序查找表顺序查找表21 37 88 19 92 05 64 56 80 75 13 0 1 2 3 4 5 6 7 8 9 10 11 ST.LengthST.elem回顾顺序表的查找过程:回顾顺序表的查找过程:假设给定值 e=64,要求 ST.elemk = e, 问: k = ?kkint location( SqList L, ElemType& e, Status (*compare)(ElemType, ElemType) k = 1; p = L.ele
7、m; while ( k=L.length & !(*compare)(*p+,e) k+; if ( k= L.length) return k; else return 0; /location21 37 88 19 92 05 64 56 80 75 13 0 1 2 3 4 5 6 7 8 9 10 11 ST.LengthST.elemi21 37 88 19 92 05 64 56 80 75 13 0 1 2 3 4 5 6 7 8 9 10 11 ST.LengthST.elemi60ikey=64key=60i64int Search_Seq(SSTable ST, KeyT
8、ype key) / 在顺序表ST中顺序查找其关键字等于 / key的数据元素。若找到,则函数值为 / 该元素在表中的位置,否则为0。 ST.elem0.key = key; / “哨兵” for (i=ST.length; ST.elemi.key!=key; -i); / 从后往前找 return i; / 找不到时,i为0 / Search_Seq 定义:定义: 查找算法的平均查找长度平均查找长度 (Average Search Length) 为确定记录在查找表中的位置,需和给定值 进行比较的关键字个数的期望值 其中: n 为表长,Pi 为查找表中第i个记录的概率, 且 , Ci为找到
9、该记录时,曾和给定值比较过的关键字的个数。分析顺序查找的时间性能niiiCPASL111niiP在等概率查找的情况下, 顺序表查找的平均查找长度为:对顺序表顺序表而言,Ci = n-i+1nPi121111n)i(nnASLnissASL = nP1 +(n-1)P2 + +2Pn-1+Pn 若查找概率无法事先测定,则查找过程采取的改进办法是,在每次查找之后,将刚刚查找到的记录直接移至表尾的位置上。在不等概率查找的情况下,ASLss 在 PnPn-1P2P1时取极小值 上述顺序查找表的查找算法简单, 但平均查找长度较大,特别不适用于表长较大的查找表。二、有序查找表二、有序查找表 若以有序表有序
10、表表示静态查找表,则查找过程可以基于“折半折半”进行。05 13 19 21 37 56 64 75 80 88 92 0 1 2 3 4 5 6 7 8 9 10 11 ST.elemST.length例如例如: key=64 的查找过程如下:lowhighmidlow mid high midlow 指示查找区间的下界high 指示查找区间的上界mid = (low+high)/2int Search_Bin ( SSTable ST, KeyType key ) low = 1; high = ST.length; / 置区间初值 while (low 50时,可得近似结果 一般情况下,
11、表长为 n 的折半查找的判定树的深度和含有 n 个结点的完全二叉树的深度相同。1) 1(log12112111nnnjnCnASLhjjniibs1) 1(log2nASLbs四、索引顺序表四、索引顺序表对比对比顺序表顺序表和和有序表有序表的查找性能之差的查找性能之差别:别: 顺序表顺序表 有序表有序表表的特性表的特性 无无序表序表 有有序表序表存储结构存储结构 顺序顺序结构或结构或 顺序顺序结构结构 链表链表结构结构插删操作插删操作 易易于进行于进行 需需移动移动元素元素ASL值值 大大 小小索引顺序表索引顺序表= =索引索引+ +顺序表顺序表一般情况下,一般情况下,索引索引是一个有序表是一
12、个有序表索引顺序表的查找过程:索引顺序表的查找过程:1)由索引确定记录所在区间;2)在顺序表的某个区间内进行查找。注意:索引可以根据查找表的特点来构造。所以, 索引顺序查找索引顺序查找的过程也是一个“缩小区间缩小区间”的查找过程。索引顺序查找的平均查找长度索引顺序查找的平均查找长度 = 查找查找“索引索引”的平均查找长度的平均查找长度 + 查找查找“顺序表顺序表”的平均查找长度的平均查找长度 一、一、哈希表是什么?哈希表是什么?二、哈希函数的构造方法哈希函数的构造方法 三、处理冲突的方法处理冲突的方法 四、哈希表的查找哈希表的查找 五、哈希表的删除操作哈希表的删除操作 六、对静态查找表,对静态
13、查找表,9.3 哈哈 希希 表表 以上两节讨论的表示查找表的各种结构结构的共同特点特点:记录在表中的位置位置和它的关关键字键字之间不存在不存在一个确定的关系,一、哈希表是什么?哈希表是什么? 查找的过程查找的过程为给定值给定值依次和关键字集合中各个关键字关键字进行比较比较, 查找的效率查找的效率取决于和给定值进行比较进行比较的关键字个数个数。 用这类方法表示的查找表,其平均查找长度都不为零。 不同的表示方法,其差别仅在于:差别仅在于:关键字和给定值进行比较的顺序不同。 只有一个办法:预先知道所查关键字在表中的位置, 对于频繁使用的查找表,希望 ASL = 0。 即,要求:记录在表中位置和其关键
14、字之间存在一种确定的关系。若以下标为以下标为000 999 的顺序表的顺序表表示之。例如:为每年招收的 1000 名新生建立一张查找表,其关键字为学号,其值的范围为 xx000 xx999 (前两位为年份)。则查找过程可以简单进行:取给定值(学号)的后三位,不需要经过比较不需要经过比较便可直接从顺序表中找到待查关键字。但是,对于动态查找表动态查找表而言,因此在一般情况下,需在关键字与记录在表中的存储位置之间建立一个函数关系,以 f(key) 作为关键字为 key 的记录在表中的位置,通常称这个函数 f(key) 为哈希函数。1) 表长不确定;2) 在设计查找表时,只知道关键字所 属范围,而不知
15、道确切的关键字。简单地说,哈希表是基于哈希函数建立的一种查找表。Zhao, Qian, Sun, Li, Wu, Chen, Han, Ye, Dei 例如:对于如下 9 个关键字设设 哈希函数哈希函数 f(key) = (Ord(第一个字母第一个字母) -Ord(A)+1)/2 0 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3ChenZhaoQianSunLiWuHanYeDei问题问题: 若添加关键字 Zhou , 怎么办?怎么办?能否找到能否找到另一个哈希函数?1) 哈希函数是一个映象映象,即: 将关键字的集合映射到某个地址集合上,将关键字的集合映射到某个地址集合上
16、, 它的设置很灵活灵活,只要这个地址集地址集合的 大小不超出允许范围不超出允许范围即可;从这个例子可见:从这个例子可见:2) 由于哈希函数是一个压缩映象压缩映象,因此,在一般情况下,很容易产生“冲突冲突”现象,即: key1 key2,而 f(key1) = f(key2)。3) 很难很难找到一个不产生冲突的哈希函数。一般情况下,只能选择恰当的哈希函数,使冲突尽可能少地产生。 因此,在构造这种特殊的“查找表” 时,除了需要选择一个“好”(尽可能少产生冲突)的哈希函数之外;还需要找到一种“处理冲突” 的方法。哈希表的定义: 根据设定的哈希函数哈希函数 H(key) 和所选中的处理冲突的方法处理冲
17、突的方法,将一组关键字映象映象到到一个有限的、地址连续的地址集 (区间) 上,并以关键字在地址集中的“象”作为相应记录在表中的存储位置存储位置,如此构造所得的查找表称之为“哈希表哈希表”。二、构造哈希函数的方法构造哈希函数的方法 对数字数字的关键字可有下列构造方法: 若是非数字关键字非数字关键字,则需先需先对其进行进行数字化处理数字化处理。1. 直接定址法直接定址法3. 平方取中法平方取中法5. 除留余数法除留余数法4. 折叠法折叠法6. 随机数法随机数法2. 数字分析法数字分析法哈希函数为关键字的线性函数 H(key) = key 或者 H(key) = a key + b1. 直接定址法直
18、接定址法此法仅适合于:此法仅适合于:地址集合的大小地址集合的大小 = = 关键字集合的大小关键字集合的大小此方法仅适合于:此方法仅适合于: 能预先估计出预先估计出全体关键字的每一位上每一位上各种数字出现的频度数字出现的频度。2. 数字分析法数字分析法 假设关键字集合中的每个关键字都是由 s 位数字组成 (u1, u2, , us),分析关键字集中的全体, 并从中提取分布均匀的若干位或它们的组合作为地址。例:例: 设有设有80个记录,关键字为个记录,关键字为8位十进制数,哈希地址位十进制数,哈希地址为为2位十进制数位十进制数。8 1 3 4 6 5 3 28 1 3 7 2 2 4 28 1 3
19、 8 7 4 2 28 1 3 0 1 3 6 78 1 3 2 2 8 1 7 8 1 3 3 8 9 6 78 1 3 6 8 5 3 78 1 4 1 9 3 5 5 分析:分析: 只取只取8 只取只取1 只取只取3、4 只取只取2、7、5 数字分布近乎随机数字分布近乎随机所以:取所以:取任意两位或两位任意两位或两位 与另两位的叠加作哈希地址与另两位的叠加作哈希地址 以关键字的平方值的中间几位作为存储地址。求“关键字的平方值” 的目的是“扩大差别” ,同时平方值的中间各位又能受到整个关键字中各位的影响。3. 平方取中法平方取中法 此方法适合于此方法适合于: 关键字中的每一位都有某些数字重
20、复出现频度很高的现象。 将关键字分割成若干部分,然后取它们的叠加和为哈希地址。有两种叠加处理的方法:移位叠加移位叠加和间界叠加间界叠加。4. 折叠法折叠法 此方法适合于此方法适合于: 关键字的数字位数特别多。5. 除留余数法除留余数法 设定哈希函数为设定哈希函数为: H(key) = key MOD p 其中其中, pm ( (表长表长) ) 并且并且 p 应为不大于应为不大于 m 的素数的素数 或是或是 不含不含 20 以下的质因子以下的质因子 给定一组关键字为:12, 39, 18, 24, 33, 21,若取 p=9, 则他们对应的哈希函数值将为: 3, 3, 0, 6, 6, 3例如:
21、例如:为什么要对 p 加限制? 可见,若 p 中含质因子 3, 则所有含质则所有含质因子因子 3 的关键字均映射到的关键字均映射到“3 的倍数的倍数”的的地址上地址上,从而增加了“冲突”的可能。6.随机数法随机数法设定哈希函数为设定哈希函数为: H(key) = Random(key)其中,其中,Random 为伪随机函数为伪随机函数 通常,此方法用于对长度不等的关键字构造哈希函数。 实际造表时,采用何种采用何种构造哈希函数的方法方法取决于建表的关键字集合的情况(包括关键字的范围和形态),总的原则是使产生冲突的可能性降到的原则是使产生冲突的可能性降到尽可能地小尽可能地小。三、处理冲突的方法处理
22、冲突的方法 “处理冲突处理冲突” 的实际含义是:为产生冲突的地址寻找下一个寻找下一个哈希地址。1. 开放定址法开放定址法2. 链地址法链地址法 为产生冲突的地址 H(key) 求得一个地址序列地址序列: H0, H1, H2, , , Hs 1 sm-1其中:H0 = H(key) Hi = ( H(key) + di ) MOD m i=1, 2, , s1. 开放定址法开放定址法对增量 di 有三种取法: 1) 线性探测再散列线性探测再散列 di = c i 最简单的情况 c=1 2) 平方探测再散列平方探测再散列 di = 12, -12, 22, -22, , , 3) 随机探测再散列
23、随机探测再散列 di 是一组伪随机数列伪随机数列 或者 di=iH2(key) (又称双散列函数探测又称双散列函数探测)即:产生的 Hi 均不相同,且所产生的 s(m-1)个个 Hi 值能覆盖覆盖哈希表中所有 地址。则要求: 注意:注意:增量增量 di 应具有应具有“完备性完备性” 随机探测时的 m 和 di 没有公因子。 平方探测时的表长 m 必为形如 4j+3 的素数(如: 7, 11, 19, 23, 等);例如例如: 关键字集合 19, 01, 23, 14, 55, 68, 11, 82, 36 设定设定哈希函数 H(key) = key MOD 11 ( 表长=11 ) 0 1 2
24、 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10190123 145568190123 1468若采用线性探测再散列线性探测再散列处理冲突若采用二次探测再散列二次探测再散列处理冲突11 8236551182361 1 2 1 3 6 2 5 1 H2(key) 是另设定的一个哈希函数,它的函数值应和 m 互为素数。若 m 为素数,则 H2(key) 可以是 1 至 m-1 之间的任意数任意数; 若 m 为 2 的幂次,则 H2(key) 应是 1 至 m-1 之间的任意奇数任意奇数。例如,当 m=11时, 可设 H2(key)=(3 key) MOD 10+1
25、0 1 2 3 4 5 6 7 8 9 101901231455681182362 1 1 1 2 1 2 1 3将所有哈希地址相同的记录都链接在同一链表中。 2. 链地址法链地址法0123456140136198223116855 ASL=(61+22+3)/9=13/9例如:同前例的关键字,哈希函数为 H(key)=key MOD 7 查找过程和造表过程一致。假设采用开放定址处理冲突,则查找过程查找过程为: 四、哈希表的查找哈希表的查找 对于给定值 K, 计算哈希地址 i = H(K)若若 ri = NULL 则查找不成功若若 ri.key = K 则查找成功否则否则 “求下一地址 Hi” ,直至 rHi = NULL (查找不成功) 或 rHi.key = K (查找成功) 为止。int hashsize = 997, . ; typedef struct ElemType *elem; int count; / 当前数据元素个数 int sizeindex; / hashsizesizeindex为当前容量 HashTable;#define SUCCESS 1#define UNSUCCESS 0#define DUP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学区房学位使用权购买合同年限约定及使用细则
- 电影院线与影视制作公司联合制作合同
- 工业遗存改造为文化创意空间的合作协议
- 智能物流解决方案AGV小车租赁与技术支持协议
- 智能健身仓健身APP开发与推广合作协议
- 商业航天测控技术培训与聘用一体化服务协议
- 企业班车运营安全责任承包合同
- 智能家居安防演示系统租赁与智能家居解决方案合作协议
- 旅游景区门票销售与托管运营合同
- 护理质量管理制度
- DL∕T 860.10-2018 电力自动化通信网络和系统 第10部分:一致性测试
- 2024年甘肃省兰州市中考地理试卷(含答案解析)
- 绿色建筑运行标识自评报告参考样式
- QCT1169-2022汽车用液晶仪表
- 放牧合同范本
- 幽门螺旋杆菌检测方法原理
- GB/T 43934-2024煤矿土地复垦与生态修复技术规范
- 政策执行小组理论综述
- 中国女性文化智慧树知到期末考试答案章节答案2024年湖南师范大学
- MOOC 数学建模-暨南大学 中国大学慕课答案
- 2-2-2单作用叶片泵工作原理
评论
0/150
提交评论