数据结构与算法 教学课件 ppt 作者 王曙燕 chapter8 查找

上传人:E**** 文档编号:89424018 上传时间:2019-05-25 格式:PPT 页数:72 大小:2.16MB
返回 下载 相关 举报
数据结构与算法 教学课件 ppt 作者  王曙燕 chapter8 查找_第1页
第1页 / 共72页
数据结构与算法 教学课件 ppt 作者  王曙燕 chapter8 查找_第2页
第2页 / 共72页
数据结构与算法 教学课件 ppt 作者  王曙燕 chapter8 查找_第3页
第3页 / 共72页
数据结构与算法 教学课件 ppt 作者  王曙燕 chapter8 查找_第4页
第4页 / 共72页
数据结构与算法 教学课件 ppt 作者  王曙燕 chapter8 查找_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《数据结构与算法 教学课件 ppt 作者 王曙燕 chapter8 查找》由会员分享,可在线阅读,更多相关《数据结构与算法 教学课件 ppt 作者 王曙燕 chapter8 查找(72页珍藏版)》请在金锄头文库上搜索。

1、1,数 据 结 构 与 算 法,8.1 概述,第 8 章 查找,8.2 基于线性表的查找法,8.3 基于树的查找法,8.4 散列,8.5 算法总结,2,8.1 概述,第 8 章 查找,查找表是由同一类型的数据元素(或记录)构成的集合。,由于“集合”中的数据元素之间存在着松散 的关系,因此查找表是一种应用灵便的结构。,数 据 结 构 与 算 法,3,第 8 章 查找,对查找表常进行的操作:,1)查询某个“特定的”数据元素是否在查找表中,3)在查找表中插入一个数据元素,2)检索某个“特定的”数据元素的各种属性,4)从查找表中删去某个数据元素,数 据 结 构 与 算 法,8.1 概述,4,第 8 章

2、 查找,查找表的分类,仅作查询和检索操作,静态查找表,“不在查找表中”的数据元素插入到查找表中; 删除其“查询”结果为“在查找表中”的数据元素。,动态查找表,查找还可分为:内查找和外查找。,8.1 概述,5,第 8 章 查找,关键字: 是数据元素(或记录)中某个数据项的值, 用以标识(识别)一个数据元素(或记录)。,主关键字:可以识别唯一的一个记录的关键字。,次关键字:可以识别若干记录的关键字。,8.1 概述,6,根据给定的某个值,在查找表中确定一个 其关键字等于给定值的数据元素(记录)。,查找,若查找表中存在这样一个记录,则称“查 找成功”。查找结果给出整个记录的信息,或指示该记录在查找表中

3、的位置; 否则称“查找不成功”。查找结果给出“空 记录”或“空指针”。,第 8 章 查找,8.1 概述,7,由于查找表中的数据元素之间不存在明显的组织规律,因此不便于查找。 为了提高查找的效率, 需要在查找表中的元素之间人为地附加某种确定的关系,换句话说,用另外一种结构来表示查找表。,如何进行查找?,查找的方法取决于查找表的结构。,第 8 章 查找,8.1 概述,8,8.2 基于线性表的查找,第 8 章 查找,顺序查找,折半查找,分块查找,9,数 据 结 构,8.2 基于线性表的查找,第 8 章 查找,顺序查找,key=64,key=60,结果:查找成功,返回位置7,结果:查找不成功,int

4、SeqSearch(RecordList l, KeyType k) int i; i=l.length; while (i=1 ,10,8.2 基于线性表的查找,第 8 章 查找,顺序查找,key=64,key=60,结果:查找成功,返回位置7,结果:查找不成功,64,60,int SeqSearch(RecordList l, KeyType k) int i; l.r0.key=k; /*标识边界*/ i=l.length; while (l.ri.key!=k) i-; return(i); ,技巧: r0起到监视哨兵的作用,可免去检查表是 否查完,且提高算法的执行效率,但并不是 真正

5、的待查找记录。,11,8.2 基于线性表的查找,第 8 章 查找,顺序查找,分析查找的时间性能:,查找算法的平均查找长度 (Average Search Length),为确定记录在查找表中的位置,需和给定值 进行比较的关键字个数的期望值(查找成功时),12,在等概率查找的情况下,顺序表查找成功的平均查找长度为:Pi=1/n,对顺序表而言,Ci = n-i+1,ASL = nP1 +(n-1)P2 + +2Pn-1+Pn,8.2 基于线性表的查找,第 8 章 查找,若查找概率无法事先测定,则查找过程采取的改进 办法是,附设一个访问频度域或者在每次查找之后, 将刚刚查找到的记录直接移至表尾的位置

6、上。,顺序查找,13,8.2 基于线性表的查找,第 8 章 查找,数 据 结 构,折半查找,顺序查找的查找算法简单,但平均查找长 度较大,特别不适用于表长较大的查找表。,若以有序表表示查找表,则查找过程 可以基于“折半”进行。,14,8.2 基于线性表的查找,第 8 章 查找,折半查找,1.首先确定查找表的中间位置;,2.然后将待查的值与中间位置的值进行比较,若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续二分查找。,基本思想:,15,8.2 基于线性表的查找,第 8 章 查找,折半查找,例1: key= 64 的查找过程如下:, low=1,low 指示查找区间的下界,high=

7、11,mid=(1+11)/2=6, keymid指向的记录值,low=mid+1=7,mid=(7+11)/2=9, keymid指向的记录值,high=mid-1=8,mid=(8+7)/2=7,key=mid所指向的记录值 查找成功,举例:,high 指示查找区间的上界,mid = (low+high)/2,70,highlow 查找不成功,16,8.2 基于线性表的查找,第 8 章 查找,折半查找,算法,int BinSrch(RecordList l, KeyType k) int low = 1, high = l.length, mid; while (low = high) m

8、id = (low + high) / 2; if (k=l.rmid. key) return mid; else if (kl.rmid. key) high = mid - 1; else low = mid + 1; return 0; ,17,8.2 基于线性表的查找,第 8 章 查找,折半查找,先看一个具体的情况,假设:n=11,判定树,3,4,2,3,4,1,3,4,2,3,4,3,1,4,9,6,7,10,2,8,11,5,找到有序表中任一记录的过程就是走了一条从根结点到与该记录相应的结点的路径, 给定值进行比较的关键字个数恰是该结点在判定树上的层次数。,ASLsuccss =

9、 (11+22+43+44)/11=33/11 ASLunsucc= (44+85)/12=56/12 折半查找的判定树是唯一的。,平均查找长度,18,8.2 基于线性表的查找,第 8 章 查找,折半查找,平均查找长度,一般情况下,表长为n的折半查找的判定树的 深度和含有n个结点的完全二叉树的深度相同。,假设 n=2h-1 并且查找概率相等,则,=(n+1)/n*log2(n+1)-1,在n50时,可得近似结果 log2(n+1)-1,折半查找只适用于有序表,且限于顺序存储结构,19,8.2 基于线性表的查找,第 8 章 查找,分块查找,(索引顺序查找),基本思想:,1、把线性表分成若干块,每

10、块包含若干个记 录,在每一块中记录的存放是任意的,但块 与块之间必须有序。(分块有序),2、建立一个索引表,把每块中的最大关键字 值及每块的第一个记录在表中的位置和最后一 个记录在表中的位置存放在索引项中。,20,索 引 表,8.2 基于线性表的查找,第 8 章 查找,分块查找,(索引顺序查找),21,8.2 基于线性表的查找,第 8 章 查找,分块查找,(索引顺序查找),索引顺序表的查找过程:,1)由索引确定记录所在区间(块);,2)在某个区间(块)内进行顺序查找。,注意:索引可以根据查找表的特点来构造。,可见, 分块查找的过程也是一个“缩小区间”的查找过程。,分块查找的平均比较次数 = 查

11、找“索引”的平均比较次数 + 查找“块内”的平均比较次数,22,第 8 章 查找,8.2 基于线性表的查找,线性表的三种查找方法比较,因此,对于不同的表长n、不同的表结构和表存储结构,应采用不同的查找方法。,23,第 8 章 查找,8.3 基于树的查找,二叉排序树,二叉平衡树,B-树,B+树,键树,24,第 8 章 查找,8.3 基于树的查找,二叉排序树,定义:,二叉排序树或者是一棵空树;或者 是具有如下特性的二叉树:,1. 若它的左子树不空,则左子树上所有 结点的值均小于根结点的值;,3. 它的左、右子树也都分别是二叉排序树。,2. 若它的右子树不空,则右子树上所有 结点的值均大于根结点的值

12、;,25,第 8 章 查找,8.3 基于树的查找,例如:,是二叉排序树。,66,不,二叉排序树,26,第 8 章 查找,8.3 基于树的查找,二叉排序树,查找算法,若给定值等于根结点的关键字,则查找成功; 若给定值小于根结点的关键字,则继续在左子树上进行查找; 若给定值大于根结点的关键字,则继续在右子树上进行查找。,否则,,若二叉排序树为空,则查找不成功;,在二叉排序树上进行查找,类似折半查找,27,第 8 章 查找,8.3 基于树的查找,例如:,二叉排序树,查找关键字,= 50 ,35 ,90 ,95,30,80,20,90,85,40,35,88,32,50,50,30,40,35,50,

13、80,90,二叉排序树,查找算法,失败,28,第 8 章 查找,8.3 基于树的查找,从上述查找过程可见,在查找过程中,生成了一条查找路径:,从根结点出发,沿着左分支或右分支逐层向下直至关键字等于给定值的结点;,从根结点出发,沿着左分支或右分支逐层向下直至指针指向空树为止。,查找成功,查找不成功,二叉排序树,查找算法,29,BSTree SearchBST(BSTree bst, KeyType key) if (!bst) return NULL; else if (bst- key=key) return bst; else if (key key) return SearchBST(bs

14、t-lchild, key); else return SearchBST(bst-rchild, key); ,第 8 章 查找,8.3 基于树的查找,二叉排序树,查找算法,-递归,30,二叉排序树,查找算法,-非递归,第 8 章 查找,8.3 基于树的查找,BSTree SearchBST(BSTree bst, KeyType key) BSTree q; q=bst; while(q) if (q-key=k) return q; if (key data.key) q=q-lchild; else q=q-rchild; return NULL; ,31,二叉排序树,插入算法,第 8

15、 章 查找,8.3 基于树的查找,根据动态查找表的定义,“插入”操作 在查找不成功时才进行;,若二叉排序树为空树,则新插入的结点为新 的根结点;否则,新插入的结点必为一个新 的叶子结点,其插入位置由查找过程得到。,32,48,二叉排序树,插入算法,第 8 章 查找,8.3 基于树的查找,设 key = 30,30,48,33,二叉排序树,插入算法,第 8 章 查找,8.3 基于树的查找,void InsertBST(BSTree *bst, KeyType key) BiTree s; if (*bst=NULL) s=(BSTree)malloc(sizeof(BSTNode); s- key=key; s-lchild=NULL; s-rchild=NULL; *bst=s; else if (key key) InsertBST( ,34,二叉排序树,生成算法,第 8 章 查找,8.3 基于树的查找,例如:设关键字输入顺序为: 45,24,53,12,28,90,28,12,53,24,45,90,24,45,53,90,12

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号