数据结构查找课件.ppt
《数据结构查找课件.ppt》由会员分享,可在线阅读,更多相关《数据结构查找课件.ppt(71页珍藏版)》请在三一办公上搜索。
1、数据结构,1,数据结构第9章 查找,什么是查找?静态查找动态查找哈希表,数据结构,2,集合关系查找表(search table),数据结构,3,查找的基本概念,查找表(Search Table):是由一些具有相同可辨认特性的数据元素(或记录)构成的集合。,对查找表经常进行的操作有:(1)查询某个特定的数据元素是否在表中;(2)查找某个特定的数据元素的各种属性;(3)在查找表中插入一个数据元素;(4)从查找表中删除某个数据元素。,静态查找表(Static Search Table):在使用时主要作前两种统称为“查找”的操作。即查找的前后不会改变查找表的内容。,动态查找表(Dynamic Sear
2、ch Table),数据结构,4,关键字:是数据元素中某个数据项的值,用它可以标识(识别)一个数据元素。若此关键字可以唯一地标识一个元素,则称此关键字为主关键字(Primary key)(对不同的元素,其主关键字均不同)。反之,称用以识别若干元素的关键字为次关键字(secondary key)。当数据元素只有一个数据项时,其关键字即为该数据元素的值。,数据结构,5,查找(searching):是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。若表中存在这样的一个元素,则称查找是成功的,此时查找的结果为给出整个数据元素的信息,或指示该数据元素在查找表中的位置;若表中不存在这样的
3、元素,则称查找不成功,此时查找的结果可给出一个“null”元素(或空指针)。,查找算法的评价标准:查找过程的主要操作是关键字的比较,所以通常以“平均比较次数”来衡量查找算法的时间效率。,对于具有n个数据元素的集合,查找某元素成功的平均查找长度为:,ASL,数据结构,6,静态查找表,顺序表的查找(顺序查找)有序表的查找(折半查找)索引顺序表的查找(分块查找),数据结构,7,顺序表的查找(顺序查找),顺序表的查找将集合中的数据元素构成一个序列,以顺序表或线性链表表示静态查找表。顺序查找的过程:从表的一端开始,顺序(逐个)扫描线性表,依次将扫描到的结点关键字和给定值Key相比较,若当前扫描到的结点关
4、键字与Key相等,则查找成功;若扫描结束后,仍未找到关键字等于Key的结点,则查找失败。,数据结构,8,顺序查找的实现,#define LIST_INIT_SIZE 100/线性表存储空间的初始分配量#define LISTINCREMENT 10/线性表存储空间的分配增量 typedef struct ElemType*elem;/存储空间基址int length;/当前长度int listsize;/当前分配的存储容量 SSTable;,数据结构,9,int Search_Seq(SSTable ST,KeyType key)int k=ST.len-1;while(k=0,int Sea
5、rch_Seq(SSTable ST,KeyType key)int k=ST.len-1;ST.elem0.key=key;/哨兵 while(ST.elemk!=key)k-;return(k);,数据结构,10,顺序查找算法分析,由顺序查找过程可见,查找表中最后一个元素时,仅需比较一次;查找表中第一个元素时,需比较n次;对任一元素i需比较n-i+1次。,设顺序表中每个记录的查找概率相同,即Pi=1/n,则顺序查找算法查找成功时的平均查找长度为:,ASLseq=,可以证明,在不等概率查找的情况下,ASLseq在 时取极小值,这就是说,如果事先已经知道查找表中各个关键字的查找概率的话,则应该
6、按照关键字的查找概率从小而大存放数据元素。,数据结构,11,有序表的查找(折半查找),折半查找要求线性表的结点按其关键字从小到大(或从大到小)按序排列,并采用顺序存储结构。,采用折半查找时,先求位于搜索区间正中的对象的下标mid,用其关键码与给定值x比较:lmid.Key=x,搜索成功;lmid.Key x,把搜索区间缩小到表的前半部分,再继续进行对分搜索;lmid.Key x,把搜索区间缩小到表的后半部分,再继续进行对分搜索。,数据结构,12,每比较一次,搜索区间缩小一半。如果搜索区间已缩小到一个对象,仍未找到想要搜索的对象,则搜索失败。,有一组有序的线性表如下:(10,14,20,32,4
7、5,50,68,90,100,120),例,下面分析在其中二分查找关键字20的过程。,数据结构,13,下面分析二分查找关键字95的过程:,数据结构,14,折半查找的实现,折半查找的主要步骤为:(1)置初始查找范围:low=1,high=n(2)求查找范围中间项:mid=(low+high)/2(3)将指定的关键字值k与中间项amid.key比较若相等,查找成功,找到的数据元素为此时mid 指向的位置;若小于,查找范围的低端数据元素指针low不变,高端数据元素指针high更新为mid-1;若大于,查找范围的高端数据元素指针high不变,低端数据元素指针low更新为mid+1;(4)重复步骤(2)
8、、(3)直到查找成功或查找范围空(lowhigh),即查找失败为止。,数据结构,15,索引顺序表的查找(分块查找),分块查找(Blocking Search)又称索引顺序查找,是一种性能介于顺序查找和二分查找之间的查找方法。,索引顺序查找表由“分块有序”的线性表和索引表组成。(1)“分块有序”的线性表线性表L被均分为若干块,每一块中的关键字不一定有序,但前一块中的最大关键字必须小于后一块中的最小关键字,即表是分块有序的。,(2)索引表抽取各块中的最大关键字及其起始位置构成一个索引表IDl.b,即:IDi(1ib)中存放第i块的最大关键字及该块在表L中的起始位置。由于表L是分块有序的,所以索引表
9、是一个递增有序表。,数据结构,16,【例】例如,图9.2就是一个带索引的分块有序的线性表。其中线性表L共有20个结点,被分成3块,第一块中最大关键字25小于第二块中的最小关键字27,第二块中最大关键字55小于第三块中的最小关键字60。,数据结构,17,分块查找的基本思想,分块查找的基本思想是:(1)首先查找索引表索引表是有序表,可采用二分查找或顺序查找,以确定待查的结点在哪一块。(2)然后在已确定的块中进行顺序查找 由于块内无序,只能用顺序查找。,分块查找方法通过将查找缩小在某个块中从而提高了查找的效率,其查找的效率由两部分组成,一是为确定某一块对索引表的平均查找长度El,二是块内查找所需的平
10、均查找长度Eb。,数据结构,18,分块查找的实现#include seqlist.h typedef struct/*索引表结点类型*/datatype key;int address;indexnode;/*-分块查找-*/int indexseqsearch(seqlist l,indexnode index,int m,datatype key)/*分块查找关键字为Key的记录,索引表为index0.m-1*/int i=0,j,last;while(iindexi.key)i+;if(i=m)return-1;else/*在顺序表中顺序查找*/,数据结构,19,if(i=m-1)j=l
11、.len-1;else j=indexi+1.address-1;/*j初始时指向本块的最后一个结点*/while(j=indexi.address,数据结构,20,二叉排序树,在线性表的三种查找方法中二分查找法具有最高的查找效率,但是它只适合于顺序存储结构,这给查找表中数据的增、删带来不便。,二叉排序树的定义 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:若它的左子树非空,则左子树上所有结点的值均小于根结点的值;若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
12、左、右子树本身又各是一棵二叉排序树。上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树,数据结构,21,例,两棵二叉排序树,(a)(b)二叉排序树示例,退化成单链表,数据结构,22,基于二叉排序树的查找运算,对于一棵给定的二叉排序树,树中的查找运算算法可描述如下:(1)当二叉树为空树时,查找失败;(2)如果二叉排序树根结点的关键字等于待查找的关键字,则查找成功;(3)如果二叉排序树根结点的关键字小于待查找的关键字,则用相同的方法继续在根结点的右子树中查找;(4)如果二叉排序树根结点的关键字大于待查找的关键字,则用相同的方法继续在根结点的左子树中查找。,数据结构
13、,23,二叉排序树的查找实现BiTree SearchBST(BiTree T,KeyType key)if(!T|key=T-data.key)return T;else if(key data.key)return SearchBST(T-lchild,key);/返回在左子树中继续查找所得结果 else return SearchBST(T-rchild,key);/返回在右子树中继续查找所得结果/SearchBST,数据结构,24,二叉排序树的查找算法分析,在二叉排序树上进行检索的方法与二分检索相似,和关键字的比较次数不会超过树的深度。,因此,在二叉排序树上进行检索的效率与树的形状有密
14、切的联系。,(a)(b)两棵具有不同检索效率的二叉排序树,数据结构,25,在最坏的情况下,含有n个结点的二叉排序树退化成一棵深度为n的单支树(类似于单链表),它的平均查找长度与单链表上的顺序查找相同,即ASL=(n+1)/2。在最好的情况下,二叉排序树形态比较匀称,对于含有n个结点的二叉排序树,其深度不超过log2n,此时的平均查找长度为O(log2n)。,例如,对于上图中的两棵二叉排序树,其深度分别是4和10,在查找失败的情况下,在这两棵树上的最大比较次数分别是4和10;在检索成功的情况下,若检索每个结点的概率相等,则对于图(a)所示的二叉排序树其平均查找长度为:ASLa=对于图(b)所示的
15、二叉排序树其平均查找长度为:ASLb=(1+2+3+4+5+6+7+8+9+10)/10=5.5,数据结构,26,基于二叉排序树的插入运算,假设待插入的数据元素为x,则二叉排序树的插入算法可以描述为:若二叉排序树为空,则生成一个关键字为x的新结点,并令其为二叉排序树的根结点;否则,将待插入的关键字x与根结点的关键字进行比较,若二者相等,则说明树中已有关键字x,无须插入;若x小于根结点的关键字,则将x插入到该树的左子树中,否则将x插入到该树的右子树中去。将x插入子树的方法与在整个树中的插入方法是相同的,如此进行下去,直到x作为一个新的叶结点的关键字插入到二叉排序树中,或者直到发现树中已有此关键字
16、为止。,数据结构,27,对于输入实例(30,20,40,10,25,45),算法9.6创建二叉排序树的过程如下:,数据结构,28,二叉排序树的插入实现Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree/SearchBST,数据结构,29,Status Insert BST(BiTree/树中已有关键字相同的结点,不再插入/Insert BST,由上述过程可知,由无序序列输入建立二叉排序树,再对其进行中序遍历可得一个有序序列,这种方法便是树排序。,数据结构,30,基于二叉树的删除运算,从二叉排序树中删除一个结点*p时,相当于删除有序序列中的
17、一个元素,但要保证删除后所得的二叉树仍然满足BST性质。即应将*p的子树(若有)仍连接在树上且保持BST性质不变。按*p的孩子数目分三种情况进行处理。(1)待删除结点为叶结点,则直接删除该结点即可。若该结点同时也是根结点,则删除后二叉排序树变为空树。下图给出了一个删除叶结点的例子;,数据结构,31,(2)待删除结点只有左子树(或右子树),而无右子树(或左子树)。根据二叉排序树的特点,可以直接将其左子树的根结点或右子树的根结点替代被删除结点的位置。,数据结构,32,(3)待删除结点*p既有左子树又有右子树。根据二叉排序树的特点,可以1)令*p的左子树为*p的左子树,而*p的右子树为*s的右子树;
18、2)用被删除结点中序下的前趋结点(或其中序下的后继结点)代替被删除结点,同时删除其中序下的前趋结点(或中序下的后继结点)。,数据结构,33,二叉排序树的删除实现Status DeleteBST(BiTree/DeleteBST,数据结构,34,Status Delete(BiTree/Delete,数据结构,35,平衡二叉树,二叉排序树上实现的查找等基本操作的平均时间虽然为O(log2n),但在最坏情况下,二叉排序树退化成一个具有单个分支的单链表,此时树高增至n,这将使这些操作的时间相应地增至O(n)。为了避免这种情况发生,人们研究了许多种动态平衡的方法,包括如何建立一棵“好”的二叉排序树;如
19、何保证往树中插入或删除结点时保持树的“平衡”,使之既保持二叉排序树的性质又保证树的高度尽可能地为O(log2n)。因此本节将介绍一种特殊的二叉树:平衡二叉树。,数据结构,36,平衡二叉树又称为AVL树,它或是一棵空树,或是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树高度之差的绝对值不超过1。,平衡因子:即为二叉树中某个结点的左子树高度与右子树高度之差。由此可知,平衡二叉树也就是树中任意结点的平衡因子的绝对值小于等于1的二叉树。,数据结构,37,如何生成(动态维护)平衡二叉树?,例(13,24,37,90,53),数据结构,38,AVL树上因插入新结点而导致失去平衡时
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 查找 课件
链接地址:https://www.31ppt.com/p-3500063.html