数据结构讲义第9章.ppt
《数据结构讲义第9章.ppt》由会员分享,可在线阅读,更多相关《数据结构讲义第9章.ppt(79页珍藏版)》请在三一办公上搜索。
1、数 据 结 构,吴 润 秀,南昌工程学院,9.1静态查找表9.2动态查找表9.3哈希表,目录,第 九 章 查找,查找的基本概念,查找表(Search Table):是由同一类型的数据元素(或记录)构成的集合。由于“集合”中的数据元素之间存在着完全松散的关系,因此查找表是一种非常灵便的数据结构。,查找表的操作:1、查询某个“特定的”数据元素是否在查找表中。2、检索某个“特定的”数据元素的各种属性。3、在查找表中插入一个数据元素;4、从查找表中刪去某个数据元素。静态查找表:对查找表只作前两种操作,这两种操作统称为“查找”的操作,则称此类查找表为静态查找表。动态查找表:在查找过程中同时插入查找表中不
2、存在的数据元素,或者从查找表中删除已存在的某个元素(也即元素集合可以根据情况动态改变),则称此类表为动态查找表。,在日常生活中,人们几乎每天都要进行“查找”工作。例如,在电话号码簿中查阅“某单位”或“某人”的电话号码;在字典中查阅“某个词”的读单和含义等等。其中“电话号码簿”和“字典”都可视作是一张查找表。查找:根据给定的某个值,在查找表中确定一个其关键字等于给定的记录或数据元素。若表中存在这样的一个记录,则称查找是成功的,此时查找的结果为给出整个记录的信息,或指示该记录在查找表中的位置;若表中不存在关键字等于给定值的记录,则称查找不成功。关键字(关键码)、主关键字、次关键字。举例:P214页
3、书,(查找学生的高考成绩),如何进行查找呢?其实,在一个结构中查找某个数据元素的过程依赖于这个数据元素在结构中所处的地位。因此,对表进行查找的方法取决于表中数据元素依何种关系(这个关系是人为地加上的)组织在一起的。举例:查电话号码时,由于电话号码簿是按用户(集体或个人)的名称(或姓名)分类且依笔划顺序编排,则查找的方法就是先顺序查找待查用户的所属类别,然后在此类中顺序查找,直到找到该用户的电话号码为止。又如,查阅英文单词时,由于字典是按单词的字母在字母表中的次序编排的,因此查找时不需要从字典中第一个单词比较起,而只要根据待查单词中每个字母在字母表中的位置查到该单词。,同样,在计算机中进行查找的
4、方法也随数据结构不同而不同。但前面我们又说到查找表中的数据元素之间存在着完全松散的关系,这给我们查找带来不便。为此,需在数据元素之间人为地加上一些关系,以例按某种规则进行查找,即以另一种数据结构来表示查找表。,一些约定:典型的关键字类型说明:typedef float KeyType;/实型 typedef int KeyType;/整型typedef char*KeyType;/字符串型,数据元素类型定义为:typedef struct KeyType key;/关键字域.ElemType;,对两个关键字的比较约定为如下的宏定义:对数值型关键字#define EQ(a,b)(a)=(b)#d
5、efine LT(a,b)(a)(b)#define LQ(a,b)(a)=(b)对字符串型关键字#define EQ(a,b)(!strcmp(a),(b)#define LT(a,b)(strcmp(a),(b)0)#define LQ(a,b)(strcmp(a),(b)=0),静态查找表,静态查找表的抽象数据类型定义:ADT StaticSearchTable数据对象D:D是具有相同特性的数据元素的集合。各个数据元素均含有类型相同,可唯一标识数据元素的关键字。数据关系R:数据元素同属一个集合。基本操作P:Create(初始条件:静态查找表ST存在。操作结果:销毁表ST。,9.1静态查找
6、法,Search(ST,key);初始条件:静态查找表ST存在,key为和关键字类型相同的给定值。操作结果:若ST中在在其关键字等于key的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。Traverse(ST,Visit();初始条件:静态查找表ST存在,Visit是对元素操作的应用函数。操作结果:按某种次序对ST的每个元素调用函数visit()一次且仅一次。一旦visit()失败,则操作失败。ADT StaticSearchTable,顺序表的查找,以顺序表或线性链表表示静态查找表,则Search函数可用顺序查找来实现。静态查找表的顺序存储结构typedef struct El
7、emType*elem;/ElemType elem100;int length;SSTable;顺序查找:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,查找不成功。int Search_Seq(SSTable ST,KeyType key)ST.elme0.key=key;for(i=ST.length;!EQ(ST.elemi.key,key);-i);return i;演示!,查找操作的性能分析:查找算法中的基本操作是将记录的关键字和给定值进行比较,通常以“其关键字和给定值进行过比较的记录个数的平均值”作为
8、衡量依据。平均查找长度:为确定记录在查找表中的位置,需用和给定值进行比较的关键字个数的期望值称为查找算法在查找成功时的平均查找长度(Average Search Length)。,其中:Pi为查找表中第i个记录的概率,且;Ci为找到表中其关键字与给定值相等的第i个记录时,和给定值已进行过比较的关键字个数。,对于含有n个记录的表,查找成功时的平均查找长度为:,假设每个记录的查找概率相等,即 Pi=1/n则在等概率情况下顺序查找的平均查找长度为:,假设查找成功与不成功的概率相同:,从顺序查找的过程可见,Ci取决于所查记录在表中的位置。如:查找表中最后一个记录时,仅需比较一次;而查找表中第一个记录时
9、,则需比较n次。一般情况下Ci=n-i+1;假设n=ST.length,则顺序查找的平均查找长度为:ASL=nP1+(n-1)P2+.+2Pn-1+Pn,前面总假设各个记录的查找概率并不相等。但实际常常情况不是这样,如果能预先知道每个记录的查找概率,则应先对记录的查找概率进行排序,使表中记录按查找概率由小至大重新排列,以便提高查找效率。但是,在一般情况下,记录的查找概率预先无法测定。为了提高查找效率,我们可以在每个记录中附设一个访问频度域,并使顺序表中的记录始终不断往后移,以例在以后的逐次查找中减少比较次数。或者在每次查找之后都将刚查找到的记录直接移至表尾。,有序表的查找(可以采用折半查找来实
10、现),以有序表表示静态查找表时,Search函数可用折半查找来实现。折半查找(Binary Search)的查找过程是:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。,见演示!,折半查找的查找实现int Search_Bin(SSTable ST,KeyType key)low=1;high=ST.length;while(low=high)mid=(low+high)/2;if EQ(key,ST.elemmid.key)return mid;else if LT(key,ST.elemmid.key)high=mid-1;else low=mid+1;ret
11、urn 0;/Search_Bin;,折半查找的性能分析 看书中的一个具体的情况,假设:n=11i 12 3 4 5 6 7 8 9 10 11Ci 3 4 2 3 4 1 3 4 2 3 4 现构造一棵二叉树,将Ci=i的结点放在这棵树的第i层该二叉树可用以描述折半查找的过程,称之谓“折半查找的判定树”,折半查找在查找成功时和给定值进行比较的关键字个数至多为:,例如:折半查找在n=11 时的判定树如下,一般情况下,表长为n的折半查找的判定树的深度和含有n个结点的完全二叉树的深度相同,那末,折半查找的平均查找长度是多少呢?假设 n=2h-1(反之,h=log2(n+1))并且查找概率相等则:,
12、在n50时,可得近似结果,可见,折半查找的效率比顺序查找高,但折半查找只能适用于有序表,且限于顺序存储结构(对线性链表无法进行折半查找)。,索引顺序表的查找 若以索引顺序表表示静态查找表,则Search函数可用分块查找来实现。分块查找又称索引顺序查找,这是顺序查找的一种改进方法。在此查找法中,除表本身以外,尚需建立一个“索引表”。,22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 49 86 53,48 861 7 13,索引表,最大关键字 起始地址,整个表中含有18个记录,可分为三个子表(R1,R2,R6)、(R7,R12)、(R13,R18)对每个子表(
13、或称块)建立一个索引项,其中包括两项内容:最大关键字项 该子表的起始地址,对索引表按关键字有序,则表或者有序或者分块有序。P225页书划上概念!,由于由索引项组成的索引表按关键字有序,则确定块的查找可以用顺序查找,亦可用折半查找,而块中记录是任意排列的,则在块中只能是顺序查找。由此,分块查找的算法即为这两种查找算法的简单合成。分块查找的平均查找长度为:ASLbs=Lb+Lw其中:Lb为查找索引表确定所在块的平均查找长度,Lb为在块中查找元素的平均查找长度。一般情况下,为进行分块查找,可以将长度为n的表均匀地分成b块,每块含有s个记录,即b=n/s;又假定表中每个记录的查找概率相等,则每块查找的
14、概率为1/b,块中每个记录的查找概率为1/s。若用顺序查找确定所在块,则分块查找的平均查找长度为:,1.索引顺序表:存储数据的表+索引;2.存储方法:数据分块存放,且块内无序,但块间有序;每块一个索引项,包括块地址和块中最大数据值。3.查找方法:首先在索引表中查找,索引是有序顺序表,可以采用折半查找方法;然后在 块内查找进行(只能)是顺序查找。,总结:,9.2动态查找法,动态查找表的定义 动态查找表的特点是:表结构本身是在查找过程中动态生成的,即对于给定值key,若表中存在其关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录。以下是动态查找表抽象数据类型的定义:,ADT D
15、ymanicSearchTable 数据对象:是具有相同特性的数据元素的集合。各个数据元素均含有类型相同,可唯一标识数据元素的关键字。数据关系:数据元素同属一个集合。,特点:用于频繁进行插入、删除、查找的所谓动态查找表。,基本操作:InitDSTable(初始条件:动态查找表DT存在,e为待插入的数据元素;操作结果:若DT中不存在其关键字等于e.key的数据元素,则插入e到DT。,DeleteDSTable(初始条件:动态查找表DT存在,Visit是对结点操作的应用函数;操作结果:按某种次序对DT的每个结点调用函数visit()一次且至多一次。一旦visit()失败,则操作失败。ADT Dyn
16、amicSearchTable,二叉排序树及其查找过程 什么是二叉排序树?二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树:、若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;、若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;、它的左、右子树了分别为二叉排序树。,122,250,300,110,200,99,L,N,P,E,M,C,Y,105,230,216,通常,取二叉链表作为二叉排序树的存储结构,二叉排序树又称二叉查找树,也可以称为二叉分类树,1、分割式查找法:查找步骤:若根结点的关键字值等于查找的关键字,成功。否则,若小于
17、根结点的关键字值,查其左子树。大于根结点的关键字值,查其右子树。在左右子树上的操作类似。,122,250,300,110,200,99,105,230,216,BiTree SearchBST(BiTree T,KeyType key)/在二叉分类树查找关键字之值为 key 的结点,找到返回该结/点的地址,否则返回空。T 为二叉分类树的根结点的地址。if(!T)|EQ(key,T-data.key)return(T);else if(LT(key,T-data.key)return(SearchBST(T-lchild,key);else return(SearchBST(T-rchild,k
18、ey);/SearchBST,表示:typedef struct BiTNode ElemType data;struct BiTNode*lchild,*rchild;BiTNode;*BiTree;,见演示!,2、插入算法:首先执行查找算法,找出被插结点的父亲结点。判断被插结点是其父亲结点的左、右儿子。将被 插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。,e、g:将数的序列:122、99、250、110、300、280 作为二叉排序树的结 点的关键字值,生成二叉排序树。,2、插入算法:首先执行查找算法,找出被插结点的父亲结点。判断被插结点是其父
19、亲结点的左、右儿子。将被 插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。,e、g:将数的序列:122、99、250、110、300、280 作为二叉排序树的结 点的关键字值,生成二叉排序树。,122,2、插入算法:首先执行查找算法,找出被插结点的父亲结点。判断被插结点是其父亲结点的左、右儿子。将被 插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。,e、g:将数的序列:122、99、250、110、300、280 作为二叉排序树的结 点的关键字值,生成二叉排序树树。,122,122,99,2、插入算法:首先
20、执行查找算法,找出被插结点的父亲结点。判断被插结点是其父亲结点的左、右儿子。将被 插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。,e、g:将数的序列:122、99、250、110、300、280 作为二叉排序树的结 点的关键字值,生成二叉排序树。,122,122,99,122,250,99,2、插入算法:首先执行查找算法,找出被插结点的父亲结点。判断被插结点是其父亲结点的左、右儿子。将被 插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。,e、g:将数的序列:122、99、250、110、300、280 作
21、为二叉排序树的结 点的关键字值,生成二叉排序树。,122,122,99,122,250,99,122,250,110,99,2、插入算法:首先执行查找算法,找出被插结点的父亲结点。判断被插结点是其父亲结点的左、右儿子。将被 插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。,e、g:将数的序列:122、99、250、110、300、280 作为二叉排序树的结 点的关键字值,生成二叉排序树。,122,122,99,122,250,99,122,250,110,99,122,250,300,110,99,2、插入算法:首先执行查找算法,找出被插结点的父亲结
22、点。判断被插结点是其父亲结点的左、右儿子。将被 插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。,122,250,300,110,280,99,e、g:将数的序列:122、99、250、110、300、280 作为二叉排序树的结 点的关键字值,生成二叉排序树。,122,122,99,122,250,99,122,250,110,99,122,250,300,110,99,2、插入算法:,Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree/SearchBST,程序实现:,122,250,300,1
23、10,99,T,p,f:null,f:T 的父亲结点p:指向最后一个结点,TRUE 找到;FALSE 叶子的父亲结点。如:插入 280 的过程。,280,2、插入算法:,执行实例:插入值为 280 的结点,2、插入算法:,Status Inset BST(BiTree/Insert BST,程序实现:,122,250,300,110,99,T,p,f:T 的父亲结点p:指向最后一个结点,TRUE 找到;FALSE 叶子的父亲结点。如:插入 280 的过程。,280,f:null,15,60,70,30,20,50,3、二叉排序树的查找分析,平均情况分析(在成功查找两种的情况下),e.g:下述两
24、种情况下的成功的平均查找长度 ASL,15,60,70,30,20,50,ASL=(1+2+2+3+3+3)/6=14/6,ASL=(1+2+3+4+5+6)/6=21/6,3、二叉排序树的查找分析,平均情况分析(在成功查找两种的情况下),在一般情况下,设 P(n,i)且它的左子树的结点个数为 i 时的平均查找长度。右图的结点个数为 n=6 且 i=3;则 P(n,i)=P(6,3)=1+(P(3)+1)*3+(P(2)+1)*2/6=1+(5/3+1)*3+(3/2+1)*2/6注意:这里 P(3)、P(2)是具有 3 个结点、2 个结点的二叉排序树的平均查找 长度。在一般情况下,P(i)为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 讲义
链接地址:https://www.31ppt.com/p-6578950.html