查找的基本概念课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《查找的基本概念课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 查找 基本概念 课件
- 资源描述:
-
1、第第8 8章章 查查 找找查找是数据处理中经常使用的一种重要运算,查找是数据处理中经常使用的一种重要运算,查找算法的优劣对系统运行效率的影响非常查找算法的优劣对系统运行效率的影响非常大。静态查找表、动态查找表和哈希表是主大。静态查找表、动态查找表和哈希表是主要的查找技术。要的查找技术。本章要点本章要点 v查找的基本概念;查找的基本概念;v几种常见的静态查找表的查找算法;几种常见的静态查找表的查找算法;v二叉排序树的创建、查找和删除算法;二叉排序树的创建、查找和删除算法;v平衡二叉树的基本操作;平衡二叉树的基本操作;v哈希函数的构造方法和哈希表的查找算法。哈希函数的构造方法和哈希表的查找算法。感
2、谢你的观看2019年8月23章节安排章节安排8.18.1查找的基本概念查找的基本概念8.28.2静态表的查找静态表的查找8.38.3动态表的查找动态表的查找8.48.4散列表散列表感谢你的观看2019年8月238.18.1查找的基本概念查找的基本概念v查找:又称检索,是指在查找表中查找满足一查找:又称检索,是指在查找表中查找满足一定条件的结点或记录。定条件的结点或记录。v查找方法:静态查找、动态查找查找方法:静态查找、动态查找 v衡量查找算法优劣指标:最大查找长度、平均衡量查找算法优劣指标:最大查找长度、平均查找长度如对查找长度如对n n个记录进行查找时,平均查找长个记录进行查找时,平均查找长
3、度可表示为:度可表示为:1niiiASL np c感谢你的观看2019年8月238.28.2静态表的查找静态表的查找 静态查找表可分为顺序表、有序表和静态查找表可分为顺序表、有序表和索引顺序表三种。索引顺序表三种。感谢你的观看2019年8月23顺序表的查找基本思想是:从顺序表的顺序表的查找基本思想是:从顺序表的一端开始,逐个比较结点的关键字和给一端开始,逐个比较结点的关键字和给定值,若某个结点的关键字与给定值相定值,若某个结点的关键字与给定值相等,则查找成功;若找遍整个顺序表都等,则查找成功;若找遍整个顺序表都不相等,则查找失败。查找成功时,查不相等,则查找失败。查找成功时,查找算法返回找到结
4、点在顺序表中的位置,找算法返回找到结点在顺序表中的位置,失败时返回失败时返回1 1。8.2.18.2.1顺序表的查找顺序表的查找 感谢你的观看2019年8月23下面的算法描述了顺序查找过程。下面的算法描述了顺序查找过程。v顺序表的存储结构定义如下:顺序表的存储结构定义如下:typedef structtypedef struct KeyTypeKeyType key key;/*关键字的数据类型关键字的数据类型*/DataType DataType;/*数据元素的类型数据元素的类型*/typedef structtypedef struct DataType DataType *datadat
5、a;/*顺序表顺序表datadata*/int len int len;/*顺序表的长度顺序表的长度*/Stable Stable;感谢你的观看2019年8月23【算法【算法8.18.1】顺序表查找算法】顺序表查找算法int Stable_Search(Stableint Stable_Search(Stable S S,KeyTypeKeyType key)key)/*在顺序表在顺序表S S中查找关键字等于中查找关键字等于keykey的结点的结点*/int int i;i;S.data0.key=key S.data0.key=key;/*设置哨兵设置哨兵*/i=S.len i=S.len;
6、/*设置初始查找位置设置初始查找位置*/while(S.datai.keywhile(S.datai.key!=key)i-!=key)i-;/*从从后往前找后往前找*/if(i=0)return 1 if(i=0)return 1;/*查找失败查找失败*/else return ielse return i;/*查找成功查找成功*/v 顺序查找的平均查找长度为:顺序查找的平均查找长度为:111(1)2ninASLnin 感谢你的观看2019年8月23 二分法查找(二分法查找(Binary SearchBinary Search)又称为折半查)又称为折半查找,其基本思想是:首先取查找表中间位置
7、上找,其基本思想是:首先取查找表中间位置上的结点的关键字与给定值进行比较,若相等,的结点的关键字与给定值进行比较,若相等,则查找成功;否则,如果给定值比中间位置上则查找成功;否则,如果给定值比中间位置上的结点的关键字大,则把查找区间定为表的后的结点的关键字大,则把查找区间定为表的后半段,反之把查找区间定为表的前半段;然后半段,反之把查找区间定为表的前半段;然后在前半段或后半段采用同样的方法继续查找,在前半段或后半段采用同样的方法继续查找,如此继续,直到找到关键字等于给定值的结点,如此继续,直到找到关键字等于给定值的结点,则查找成功;若出现查找区间的左右边界异常,则查找成功;若出现查找区间的左右
8、边界异常,则查找失败。则查找失败。8.2.28.2.2有序表的查找有序表的查找 感谢你的观看2019年8月23例:已知有例:已知有1111个关键字的有序表序列如下所示:个关键字的有序表序列如下所示:0202,0808,1515,2323,3131,3737,4242,4949,6767,8383,9191 当给定的当给定的k k值为值为2323和和8383时,折半查找的过程如图时,折半查找的过程如图所示。图中用方括号表示当前的查找区间,用所示。图中用方括号表示当前的查找区间,用“”指向中间位置。指向中间位置。感谢你的观看2019年8月23【算法【算法8.28.2】二分法查找非递归算法】二分法查
9、找非递归算法int Binary_Search(Stableint Binary_Search(Stable S S,KeyTypeKeyType key)key)intint low low,midmid,highhigh;low=1low=1;high=S.lenhigh=S.len;while(lowwhile(low=high)mid=(low+high)/2=high)mid=(low+high)/2;if(keyS.datamid.keyif(keyS.datamid.keyif(keyS.datamid.key)low=mid+1low=mid+1;else return mid
10、 else return mid;return 1return 1;感谢你的观看2019年8月23索引顺序查找又称为分块查找,是顺序查找的一索引顺序查找又称为分块查找,是顺序查找的一种改进方法。在索引顺序查找法中,除表本身以种改进方法。在索引顺序查找法中,除表本身以外,还需要建立一个外,还需要建立一个“索引表索引表”。分块查找的基本思想:把顺序表分成若干块,每分块查找的基本思想:把顺序表分成若干块,每一块中结点的存放是任意的,但是块与块之间必一块中结点的存放是任意的,但是块与块之间必须有序。假设块间按关键字值递增排序,以每块须有序。假设块间按关键字值递增排序,以每块中的最大(小)关键字值建立一
11、个索引表,存放中的最大(小)关键字值建立一个索引表,存放每块的最大(小)关键字值和每块的起始位置。每块的最大(小)关键字值和每块的起始位置。查找时需分两步走,首先在索引表中采用顺序查查找时需分两步走,首先在索引表中采用顺序查找或折半查找算法查找给定值,确定给定值所在找或折半查找算法查找给定值,确定给定值所在的块;然后在所确定的块中顺序查找。的块;然后在所确定的块中顺序查找。8.2.38.2.3索引顺序表的查找索引顺序表的查找 感谢你的观看2019年8月23 例例8.2 8.2 设有一个顺序表共有设有一个顺序表共有2020个结点,现将它个结点,现将它分成四块,每块分成四块,每块5 5个结点。以每
12、块最大关键字值建个结点。以每块最大关键字值建立索引表,索引表包含最大关键字值和对应块的立索引表,索引表包含最大关键字值和对应块的起始地址两个域,如图起始地址两个域,如图8.28.2所示。试查找关键字值所示。试查找关键字值为为5858的结点。的结点。图图8.2表及索引表结构图表及索引表结构图感谢你的观看2019年8月23分块查找的平均查找长度:分块查找的平均查找长度:ASLASLbsbs=ASLASLb b+ASLASLw wASLASLbsbs表示分块查找的平均查找长度,表示分块查找的平均查找长度,ASLASLb b表表 示查找索引表以确定所在块的平均查找长度,示查找索引表以确定所在块的平均查
13、找长度,ASLASLw w表示在块中查找关键字的平均查找长度。表示在块中查找关键字的平均查找长度。感谢你的观看2019年8月238.38.3动态表的查找动态表的查找 动态查找表的特点是:表结构本身是在查动态查找表的特点是:表结构本身是在查找过程中动态生成的,即对于给定值找过程中动态生成的,即对于给定值keykey,若表中存在关键字等于若表中存在关键字等于keykey的结点,则查找的结点,则查找成功;否则插入关键字为成功;否则插入关键字为keykey的结点。的结点。感谢你的观看2019年8月23二叉排序树又称二叉查找树,它或者是一棵空二叉排序树又称二叉查找树,它或者是一棵空树,或者是具有以下性质
14、的二叉树:树,或者是具有以下性质的二叉树:若任一结点的左子树非空,则左子树中的所有若任一结点的左子树非空,则左子树中的所有结点的值都不大于根结点的值;结点的值都不大于根结点的值;若任一结点的右子树非空,则右子树中的所有若任一结点的右子树非空,则右子树中的所有结点的值都不小于根结点的值。结点的值都不小于根结点的值。8.3.1 8.3.1二叉排序树二叉排序树 感谢你的观看2019年8月23 例如:图例如:图8.38.3所示为一棵二叉排序树(结点内的所示为一棵二叉排序树(结点内的数为数据元素的关键字)。其中序遍历序列为:数为数据元素的关键字)。其中序遍历序列为:1515,5555,6565,7575
15、,7979,9595,100100,120120,200200,230230,240240。图图8.3 8.3 二叉排序树二叉排序树感谢你的观看2019年8月23二叉排序树一般采用二叉链表作为存储结二叉排序树一般采用二叉链表作为存储结构,可定义如下:构,可定义如下:typedef struct BSTNodetypedef struct BSTNode DataTypeDataType datadata;/*数据元素字段数据元素字段*/struct BSTNodestruct BSTNode *lchildlchild,*rchildrchild;/*左、右指针字段左、右指针字段*/NodeT
16、ypeNodeType;感谢你的观看2019年8月23【算法【算法8.38.3】二叉排序树查找算法】二叉排序树查找算法int BST_Search(NodeTypeint BST_Search(NodeType *T T,KeyType KeyType key,NodeType key,NodeType*p,NodeTypep,NodeType *q)q)if(T)if(T)*p=Tp=T;*q=NULL;q=NULL;while(while(*p)p)if(key(if(key(*p)-p)-data.keydata.key)*q=q=*p p ;(*p)=(p)=(*p)-rchildp)
17、-rchild;elseelseif(keydata.keyif(keydata.key)*q=q=*p p ;(*p)=(p)=(*p)-lchildp)-lchild;else elsereturn 1return 1;return 0return 0;感谢你的观看2019年8月23 二叉排序树的插入和生成过程如下:二叉排序树的插入和生成过程如下:(1)(1)若二叉排序树为空,则把待插入的结点作为根若二叉排序树为空,则把待插入的结点作为根结点插入到空树中。结点插入到空树中。(2)(2)若二叉排序树非空,则将待插入的结点关键字若二叉排序树非空,则将待插入的结点关键字和根结点的关键字进行比较,
18、若两者相等,表示该和根结点的关键字进行比较,若两者相等,表示该结点已在二叉排序树中,无需插入;若待插入的结结点已在二叉排序树中,无需插入;若待插入的结点关键字小于根结点的关键字,将待插入的结点插点关键字小于根结点的关键字,将待插入的结点插入到根的左子树中,否则插入到右子树中。入到根的左子树中,否则插入到右子树中。(3)(3)子树中的插入过程和树中的插入过程相同,如子树中的插入过程和树中的插入过程相同,如此插入下去,直到把待插入的结点作为叶子插入到此插入下去,直到把待插入的结点作为叶子插入到二叉排序树中。二叉排序树中。感谢你的观看2019年8月23【算法【算法8.48.4】二叉排序树的插入算法】
19、二叉排序树的插入算法int InsertNode(NodeTypeint InsertNode(NodeType *t t,KeyType key)KeyType key)NodeTypeNodeType *p,p,*q q,*s;s;if(!BST_Searchif(!BST_Search(*t t,key,&p,&q)key,&p,&q)s=(NodeTypes=(NodeType*)malloc(sizeof(NodeType)malloc(sizeof(NodeType););s-data.keys-data.key=key=key;s-lcs-lc=NULL=NULL;s-rcs-r
20、c=NULL=NULL;if(!pif(!p)t=st=s;elseelse if(keyp-data.key)if(keyp-data.key)p-rchildp-rchild=s=s;elseelsep-lchildp-lchild=s=s;return 1 return 1;return 0return 0;感谢你的观看2019年8月23 例如,给定关键字序列例如,给定关键字序列5353,8080,6969,4545,5858,3030,8888,则构造相对应的一棵二叉排序树的,则构造相对应的一棵二叉排序树的过程如图过程如图8.58.5所示:所示:(a)(a)(b)(b)5353(c)(
21、c)53538080(d)(d)696980805353(e)(e)6969808053534545(f)(f)69698080535345455858(g)(g)6969808053534545585830306969808053534545585830308888(h)(h)图图8.58.5二叉排序树的插入过程二叉排序树的插入过程(a)(a)空树;(空树;(b b)插入)插入5353;(c)(c)插入插入9090;(d)(d)插入插入6969;(e)(e)插入插入4545;(f)(f)插入插入5858;(g)(g)插入插入3030;(h)(h)插入插入8888;感谢你的观看2019年8月2
22、3二叉排序树的删除二叉排序树的删除 设待删结点的为设待删结点的为p p,p p的双亲结点为的双亲结点为d d,若,若p p的左右孩的左右孩子分别为子分别为plpl和和prpr,则删除操作可分以下三种情况进,则删除操作可分以下三种情况进行讨论:行讨论:(1 1)若结点)若结点p p为叶子结点,则为叶子结点,则plpl和和prpr均为空二叉树。均为空二叉树。由于删除叶子结点不会破坏整棵树的结构,则根据由于删除叶子结点不会破坏整棵树的结构,则根据p p是是d d的左子树还是右子树,将的左子树还是右子树,将d d的左孩子或右孩子的左孩子或右孩子指针域置空即可。删除过程如图指针域置空即可。删除过程如图8
23、.68.6所示。所示。(b)607555365912删去叶子结点80图8.6删除二叉排序树中的叶子结点(a)删除叶子80之前;(b)删除叶子80之后60755536591280(a)p感谢你的观看2019年8月23 (2 2)若结点)若结点p p只有左子树只有左子树plpl或右子树或右子树prpr时,时,则用则用p p的左子树的根结点的左子树的根结点plpl或右子树的根结或右子树的根结点点prpr取代被删除的结点即可。删除过程如取代被删除的结点即可。删除过程如图图8.78.7所示。所示。图8.7删除二叉排序树中的单支结点(a)删除左单支结点36之前;(b)删除左单支结点36之后;(a)删除右单
24、支结点80之前;(b)删除右单支结点80之后删去左单支结点3660755536591280(a)p9080(b)607555125990删去右单支结点8060755536591280(c)90p60755536591290(d)感谢你的观看2019年8月23 (3 3)若结点)若结点p p同时有左右子树同时有左右子树plpl和和PrPr时,则时,则用被删除结点的左子树的根取代被删除的用被删除结点的左子树的根取代被删除的结点,将被删除结点的右子树移动到被删结点,将被删除结点的右子树移动到被删除结点的左子树的最右下方,即用结点除结点的左子树的最右下方,即用结点plpl取代结点取代结点p p,将,将
25、PrPr及其子树移动到及其子树移动到plpl的右子的右子树的最右下方,如图树的最右下方,如图8.88.8所示。所示。(a)dpp rp l8060755512599070(b)p lp r70596055128090图8.8删除二叉排序树中的具有左右子树的结点(a)删除有左右子树结点75之前;(b)删除有左右子树结点75之后感谢你的观看2019年8月23【算法【算法8.58.5】二叉排序树的删除算法】二叉排序树的删除算法int DeleteNode(NodeTypeint DeleteNode(NodeType *t t,KeyTypeKeyType key)key)/*在二叉排序树在二叉排序
展开阅读全文