数据结构九章查找.ppt
《数据结构九章查找.ppt》由会员分享,可在线阅读,更多相关《数据结构九章查找.ppt(71页珍藏版)》请在三一办公上搜索。
1、数据结构第九章查找,本章内容9.1 查找的基本概念9.2 静态查找表9.3 动态查找表9.4 哈希表,9-3,9.1 查找的基本概念,查找表(Search Table)查找表是由同一类型的数据元素(或记录)构成的集合。对查找表的操作主要有:查询某个“特定的”数据元素是否在查找表中;检索某个“特定的”数据元素的各种属性;在查找表中插入一个数据元素;从查找表中删去某个数据元素。查找表分类静态查找表仅作查询和检索操作的查找表。动态查找表在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素,9-4,9.1 查找的基本概念,关键字(Key)关键字是数据元素(或记录)中某个
2、数据项的值,用以标识(识别)一个数据元素(或记录)。主关键字:可以识别唯一的一个记录的关键字次关键字:能识别若干记录的关键字查找(Searching)是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。,9-5,9.1 查找的基本概念,衡量查找算法的标准时间复杂度;空间复杂度;平均查找长度ASL:定义为确定记录在表中的位置所进行的和关键字比较的次数的平均值 n ASL=PiCi i=1n为查找表的长度,即表中所含元素的个数Pi为查找第i个元素的概率(Pi=1)Ci是查找第i个元素时同给定值K比较的次数,9-6,9.2 静态查找表,9.2.1 顺序表的查找顺序查找算法是
3、顺序表(既无序表)的查找方法。在顺序查找算法中,以顺序表或线性链表表示静态查找表。面临的问题下标越界的检查,需要相当的时间和空间代价。解决的办法是,将ST.elem0.key 置为key,所有元素检查完还没有找到时,在ST.elem0处一定找到。从而免去了检查下标越界的时间。顺序查找算法从表中最后一个记录开始逐个进行记录的关键字和给定值的比较若某个记录比较相等,则查找成功若直到第1个记录都比较不等,则查找不成功,9-7,9.2 静态查找表,顺序查找算法描述设置“哨兵”的目的是省略对下标越界的检查,提高算法执行速度。当然,哨兵也可以设置在高下标处。,int Search_Seq(SSTable
4、ST,KeyType key)/若查找成功,返回位置ST.elem0.key=key;/“哨兵”,for(i=ST.length;ST.elemi.key!=key;-i);/从后往前找return i;/找不到时,i=0,9-8,9.2 静态查找表,顺序查找示举例在下列顺序表中寻找62,如果找到,给出其所在位置的下标。,监视哨兵,比较次数=5,比较次数分析:查找第n个元素:1次查找第n-1个元素:2次.查找第1个元素:n次查找第i个元素:n+1-i次查找失败:n+1次,0 1 2 3 4 5 6 7 8 9 10 11,9-9,9.2 静态查找表,顺序查找性能分析对顺序表而言,Ci=n-i+
5、1在等概率查找的情况下,Pi=1/n平均查找长度 ASLss=n*P1+(n-1)P2+2Pn-1+Pn=(n+1)/2如果被查找的记录概率不等时,ASLss在 PnPn-1 P2P1 时取极小值若查找概率无法事先测定,则查找过程采取的改进办法是,在每次查找之后,将刚刚查找到的记录直接移至表尾的位置上。顺序查找特点优点:1.简单2.适应面广(对表的结构无任何要求)缺点:1.平均查找长度较大2.特别是当n很大时,查找效率很低,9-10,9.2 静态查找表,9.2.2 折半查找折半查找算法是有序表的查找方法。在折半查找算法中,静态查找表按关键字大小的次序,有序地存放在顺序表中。折半查找的原理先确定
6、待查记录所在的范围(前部分或后部分)逐步缩小(一半)范围直到找(不)到该记录为止,9-11,9.2 静态查找表,折半查找算法n个对象从小到大存放在有序顺序表ST中,k为给定值设low、high指向待查元素所在区间的下界、上界,即low=1,high=n设mid指向待查区间的中点,即 mid=(low+high)/2让k与mid指向的记录比较 若 k=STmid.key,查找成功 若 kSTmid.key,则low=mid+1下半区间重复3,4操作,直至lowhigh时,查找失败。,9-12,9.2 静态查找表,折半成功查找举例:在下列有序表中用折半查找法查找62所在位置。Key=62,第一步:
7、low=1,high=11,mid=6,STmid=ST6=5662,则改变low;,第二步:low=mid+1=7,mid=9,STmid=ST9=8062,则改变high;,第三步:high=mid-1=8,mid=7,STmid=ST7=62=62,找到!,62,9-13,9.2 静态查找表,折半查找失败举例:在上例有序表中找61。,high=6,low=7,找61,当下界low大于上界high时,说明有序 表中没有关键字等于K的元素,查找失败,9-14,9.2 静态查找表,折半查找的性能分析折半查找过程可以用二叉树(也叫判定树)来描述:判定树上每个结点需要的查找次数刚好为该结点所在的层
8、数;查找成功时查找次数不会超过判定树的深度n个结点的判定树的深度为 log2n+1比较次数最多不超过 log2n+1折半查找的算法复杂度为 log2n+1,9-15,9.2 静态查找表,折半查找特点折半查找的效率比顺序查找高,特别是查找表的长度很长时;折半查找只能适用于等概率有序表,并且以顺序存储结构存储。,9-16,9.2 静态查找表,9.2.3 分块查找分块查找是一种索引顺序表(分块有序表)查找方法,是折半查找和顺序查找的简单结合;索引顺序表(分块有序表)将整个表分成几块,块内无序,块间有序所谓块间有序是指后一块表中所有记录的关键字均大于前一块表中的最大关键字,9-17,9.2 静态查找表
9、,基本概念主表:用数组存放待查记录,每个数据元素至少含有关键字域索引表:每个结点含有最大关键字域和指向本块第一个结点的指针,9-18,9.2 静态查找表,分块查找举例采用折半查找方法在索引表中找到块(第2块)用顺序查找方法在主表对应块中找到记录(第3个记录),找62,9-19,9.2 静态查找表,分块查找性能分析若将长度为n的表分成b块,每块含s个记录,并设表中每个记录查找概率相等用折半查找方法在索引表中查找索引块,ASL块间log2(n/s+1)用顺序查找方法在主表对应块中查找记录,ASL块内=s/2ASLlog2(n/s+1)+s/2,9-20,9.3 动态查找表,动态查找表如果应用问题涉
10、及的数据量很大,而且数据经常发生变化,如图书馆经常购进图书,每购进新书,需将新书记录插入图书表,对这类表除了提供前面的介绍的查找外,还要提供动态查找功能:查找某个“特定”元素是否在表中,若不在,将该元素插入;查找某个“特定”元素是否在表中,若在,从表中删除;如何组织动态查找表?用静态查找方法不能满足要求了。本节介绍几种方法。,9-21,9.3 动态查找表,9.3.1 二叉排序树二叉排序树又称二叉查找树空树或者是具有如下特性的二叉树:若左子树不空,则左子树上所有结点的值均小于根结点的值;若右子树不空,则右子树上所有结点的值均大于根结点的值;左、右子树也都分别是二叉排序树。,21,二叉排序树,非二
11、叉排序树,9-22,9.3 动态查找表,二叉排序树查找算法 给定值与根结点比较:若相等,查找成功若小于,查找左子树若大于,查找右子树,例1:在右图二叉排序树中查找关键字值等于37,37,找到,例2:在右图二叉排序树中查找关键字值等于88,找到,例3:在右图二叉排序树中查找关键字值等于94,无此数,9-23,9.3 动态查找表,二叉排序树插入二叉排序树是一种动态树表。当树中不存在查找的结点时,作插入操作新插入的结点一定是叶子结点(只需改动一个结点的指针)该叶子结点是查找不成功时路径上访问的最后一个结点左孩子或右孩子(新结点值小于或大于该结点值),例:在右图二叉树中插入结点94。,9-24,9.3
12、 动态查找表,二叉排序树生成例:画出在初始为空的二叉排序树中依次插入56,64,92,80,88,75时该树的生长全过程,56,9-25,9.3 动态查找表,二叉排序树中序遍历中序遍历二叉排序树,可得到一个关键字的有序序列,如5,13,19,21,37,56,64,92,75,80,88,9-26,9.3 动态查找表,二叉排序树删除删除二叉排序树中的一个结点后,必须保持二叉排序树的特性:左子树的所有结点值小于根结点,右子树的所有结点值大于根结点。也即保持中序遍历后,输出为有序序列被删除结点具有以下三种情况是叶子结点只有左子树或右子树同时有左、右子树下面针对三种情况各举一例。,9-27,9.3
13、动态查找表,被删除结点是叶子结点:直接删除结点,并让其父结点指向该结点的指针变为空。例:删除右二叉排序树中的88节点,56,64,5,92,37,88,19,80,21,13,75,9-28,9.3 动态查找表,被删除结点只有左子树或右子树删除结点,让其父结点指向该结点的指针指向其左子树(或右子树),即用孩子结点替代被删除结点即可例:对于右边二叉排序树中,先删除节点37,再删除节点64。,56,5,13,9-29,9.3 动态查找表,被删除结点p既有左子树,又有右子树以中序遍历时的直接前驱s替代被删除结点p,然后再按照前面介绍的发删除该直接前驱s(只可能有左孩子),56,64,5,92,37,
14、88,80,13,75,例:在右边二叉排序树中,节点56的中序遍历的直接前趋是节点37。,9-30,9.3 动态查找表,二叉排序树性能分析在最好的情况下,二叉排序树为一近似完全二叉树时,其查找深度为log2n量级,即其时间复杂性为O(log2n)在最坏的情况下,二叉排序树为近似线性表时(如以升序或降序输入结点时,见右图),其查找深度为n量级,即其时间复杂性为O(n),9-31,9.3 动态查找表,二叉排序树特性一个无序序列可以通过构造一棵二叉排序树而变成一个有序序列(通过中序遍历)插入新记录时,只需改变一个结点的指针,相当于在有序序列中插入一个记录而不需要移动其它记录二叉排序树既拥有类似于折半
15、查找的特性,又采用了链表作存储结构但当插入记录的次序不当时(如升序或降序),则二叉排序树深度很深(见右图),增加了查找的时间,9-32,9.3 动态查找表,平衡二叉树平衡二叉树(Balanced Binary Tree,Height-Balanced Tree,又称AVL树,Adelsen-Velskii and Landis,阿德尔森一维尔斯和兰迪斯)是二叉排序树的另一种形式。其特点为:树中每个结点的左、右子树深度之差的绝对值不大于1,即|hL-hR|1。可以证明,它们的深度和logn是同数量级的(其中n为节点个数)。,AVL树,非AVL树,9-33,9.3 动态查找表,平衡二叉树平衡因子每
16、个结点附加一个数字,给出该结点左子树的高度减去右子树的高度所得的高度差,这个数字即为结点的平衡因子(balance factor)AVL树任一结点平衡因子只能取-1,0,1若某个结点的平衡因子的绝对值大于1,则这棵二叉搜索树就失去了平衡,不再是AVL树。,9-34,9.3 动态查找表,非平衡二叉树的平衡处理若一棵二叉排序树是平衡二叉树,扦入某个结点后,可能会变成非平衡二叉树,这时,就可以对该二叉树进行平衡处理,使其变成一棵平衡二叉树。处理的原则应该是处理与插入点最近的、而平衡因子又比1大或比-1小的结点。下面将分四种情况讨论平衡处理。,9-35,9.3 动态查找表,LL型 的处理(左左型)如下
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 查找
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5355806.html