ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:40.97KB ,
资源ID:5954003      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5954003.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构授课教案第8章查找.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构授课教案第8章查找.docx

1、数据结构授课教案第8章查找山东轻工业学院教师授课教案课程名称:数据结构(计科)课程代码:0301306学 分:4.5课程类别:必修开课单位:信息科学与技术学院授课班级:授课教师:杨春花 山东轻工业学院教务处制授课时间年 月 日 星期 第 节年 月 日 星期 第 节年 月 日 星期 第 节授课内容概要第八章 查找第一节 静态查找表查找的基本概念和术语;静态查找表的存储结构表示;顺序查找的过程、算法和性能分析;折半查找的过程、算法和性能分析;分块查找的过程和分析。第二节 动态查找表二叉排序树的定义;二叉排序树的查找、插入和删除;二叉排序树的查找分析;平衡二叉树的定义和平衡化的方法;B-树的定义、查

2、找和查找分析、插入和删除,B+树的概念。第三节 哈希表哈希表、哈希函数、哈希地址、同义词等概念;哈希函数的构造方法;处理冲突的方法;哈希表的构造;哈希表的存储结构、查找算法和分析。目的要求目的:理解查找的基本方法。基本要求:了解平衡二叉树的平衡化方法、B树的插入和删除和键树的概念;理解分块查找的基本思想、哈希表的基本概念、哈希函数的构造方法和处理冲突的方法;掌握查找的基本概念、顺序查找和折半查找的基本思想和算法、二叉排序树的概念和基本操作和哈希表的构造方法。重 点顺序查找和折半查找的思想、算法和分析;二叉排序树的概念、构造、插入和删除;B-树的插入和删除方法;哈希表的基本概念和哈希表的构造方法

3、。难点折半查找的算法和分析;二叉排序树的插入和删除;平衡二叉树的平衡化方法;B-树的插入和删除方法;哈希表的构造方法。作业布置习题9参考书1. 数据结构题集(C语言版), 严蔚敏,清华大学出版社,2002。3. 数据结构、算法与应用C+语言描述,(美)Sartaj Sahni著,汪诗林等译,机械工业出版社,2002。课 型理论课学时分配复 习 分钟主要教具投影、黑板讲 授 分钟教学方法讲解、提问、示例指 导 分钟教学手段板书、课件总 结 分钟备注共10学时,其中2学时为习题课注:课型一栏填写理论课、实验课、习题课等授 课 内 容备 注第9章 查找9.1 基本概念和术语1 数据项 (也称项或字段

4、): 是具有独立含义的标识单位,是数据不可分割的最小单位。2 组合项 由若干项、组合项构成。 3 数据元素(记录) 是由若干项、组合项构成的数据单位,是在某一问题中作为整体进行考虑和处理的基本单位。4关键码(key) 关键码是数据元素(记录)中某个项或组合项的值,用它可以标识一个数据元素(记录)。 能唯一确定一个数据元素(记录)的关键码,称为主关键码(Primary Key);不能唯一确定一个数据元素(记录)的关键码,称为次关键码(Secondary Key)。5 查找表(Search Table ) 是由具有同一类型(属性)的数据元素组成的集合(又称为字典)。分为静态查找表和动态查找表两类:

5、 静态查找表(Static Search Table):仅对查找表进行查找操作,而不能改变的表; 动态查找表(Dynamic Search Table):对查找表除进行查找操作外,允许向表中插入或删除表中数据元素的表。6.查找(searching) 按给定的某个值kx,在查找表中确定一个其关键码等于kx的数据元素(记录)。7 数据元素类型说明typedef struct /* 出生日期类型定义 */ char year5; /* 年:用字符型表示,宽度为4个字符 */ char month3; /* 月:字符型,宽度为 2 */ char date3; /* 日:字符型,宽度为 2 */ Bi

6、rthDate;typedef struct /* 数据元素类型定义 */ char number7; /* 学号:字符型,宽度为6 */ char name9; /* 姓名:字符型,宽度为8 */ char sex3; /* 性别:字符型,宽度为2 */ BirthDate birthdate;/*出生日期:构造类型 */ char comefrom21; /* 来源:字符型,宽度为20 */ int results; /* 成绩:整型,宽度由 “C语言”决定 */ ElemType; 8 查找表的类型定义例:用线性表表示查找表:(1)用顺序表来表示查找表: typedef MAXSIZE

7、1000 typedef struct/顺序存储结构 ElemType elemMAXSIZE+1; int length; SStable;(2)用单链表表示查找表 typedef struct LNode ElemType data; struct LNode *next; LNode,*LinkList; 用其它形式表示的线性表的类型定义在以后的章节中解释。说明: 本章以后讨论中,涉及的关键码类型和数据元素类型统一说明如下: typedef struct KeyType key;/*关键码字段,可以是整型、字符型、构造型等*/ /* 其它字段 */ ElemType;9.2 静态查找表9

8、.2.1静态查找表结构静态查找表是数据元素的线性表,可以是基于数组的顺序存储或以线性链表存储。typedef MAXSIZE 1000typedef struct/顺序存储结构 ElemType elemMAXSIZE+1; int length; SStable;typedef struct LNode/链式存储结构 ElemType data; struct LNode *next; LNode,*LinkList;9.2.2 顺序查找(Sequential Search)查找方法:从表的一端开始,向另一端逐个按给定值kx与关键码进行比较,若找到,查找成功,并给出数据元素在表中的位置;若整

9、个表检测完,仍未找到与kx相同的关键码,则查找失败,给出失败信息。 例:给定kx=56,90,在下表中进行顺序查找。/不设置监视哨的顺序查找算法 int search_Seq(SSTable ST,KeyType kx) i=l.length; while (i=1&ST.elemi.key!=kx) i-; return i; 【算法9.1】以顺序存储为例,数据元素从下标为1的数组单元开始存放,0号单元留空。 int search_Seq(SSTable ST,KeyType kx) /*在表tbl中查找关键码为kx的数据元素,若找到返回该元素在数组中的下标,否则返回0 */ST.elem0

10、.key = kx;/* 监视哨*/ for(i=ST.length ; ST.elemi.key!= kx ;i- ); return i; 【性能分析】 分析查找算法的效率,通常用平均查找长度ASL来衡量。定义:在查找成功时,平均查找长度ASL是指为确定数据元素在表中的位置所进行的关键码比较次数的期望值。其中:Pi为表中第i个数据元素的查找概率, Ci为表中第i个数据元素的关键码与给定值kx相等时,按算法定位关键码的比较次数。对一个含n个数据元素的表,查找成功时,顺序查找的平均查找长度为: 查找不成功时,关键码的比较次数总是n+1次。算法中的基本工作就是关键码的比较,因此,查找长度的量级就

11、是查找算法的时间复杂度,其为O(n)。顺序查找缺点:当n很大时,平均查找长度较大,效率低; 优点:是对表中数据元素的存储没有要求。另外,对于线性链表,只能进行顺序查找。 9.2.3有序表的折半查找条件:要求待查找的列表必须是按关键字大小有序排列的顺序表。 基本过程:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。例:已知含11个元素的有序表(关键字即为数据元素

12、的值): (05,13,19,21,37,56,64,75,80,88,92) 查找关键字21和85的数据元素。 【算法9.2】int Search_Bin (SSTable ST,KeyType kx) low=1;high=ST.length; while(low=high) mid=(low+high)/2; if(kx=ST.elemmid.key) return mid; else if(kxtbl.elemmid.key) low=mid+1; else high=mid-1; return 0; 【性能分析】折半查找过程可用一棵判定树来描述。判定树中每一结点对应表中一个记录,但结

13、点值不是记录的关键字,而是记录在表中的位置序号。根结点对应当前区间的中间记录,左子树对应前一子表,右子树对应后一子表。 例: 对于下面有序表进行折半查找的判定树如下:(05,13,19,21,37,56,64,75,80,88,92) 查找表中任一元素的过程,即是判定树中从根到该元素结点路径上各结点关键码的比较次数,也即该元素结点在树中的层次数。对于n个结点的判定树,树高为k,则有kkey=key) return T;/*查找成功*/ else if (key key) return SearchBST(T-lchild, key); else return SearchBST(T-rchil

14、d, key); 非递归算法:BiTree SearchBST(BiTree T, KeyType key) p=T; while(P) if (p-key=key) return p;/*查找成功*/ else if (keykey) p=p-lchild; else p=p-rchild; return NULL;/*查找失败*/ /*SearchBST*/ 3.二叉排序树的插入和生成二叉排序树中插入一个结点:设待插入结点的关键码为kx,先在二叉排序树中进行查找,若查找成功,不用插入;查找不成功时,则插入之。因此,新插入结点一定是作为叶子结点添加上去的。构造一棵二叉排序树则是逐个插入结点的

15、过程。例:记录的关键码序列为:63,90,70,55,67,42,98,83,10,45,58,则构造的一棵二叉排序树为:二叉排序树中插入结点的递归算法:void InsertBST(BiTree &T, KeyType key) if (T=NULL) s=(BiTree)malloc(sizeof(BitNode); s-key=key;s-lchild=NULL;s-rchild=NULL; T=s; else if(keykey) InsertBST(T-lchild,key); else if (keyT-key) InsertBST(T-rchild,key); 二叉排序树中插入结

16、点的非递归算法:void InsertBST(BiTree &T, KeyType key) p=NULL;q=T;while(q!=NULL) if (kx=q-key) return; else if (kxkey) p=q;q=q-lchild; else p=q;q=q-rchild;s=(BiTree)malloc(sizeof(BitNode);s-key=key;s-lchild=NULL;s-rchild=NULL;if (p=NULL) T=s;else if (keykey) p-lchild=key; else p-rchild=key; 创建二叉排序树的算法: void

17、 CreateBST(BiTree &T) T=NULL; scanf(%d, &key); while (key!=ENDKEY) /*ENDKEY为自定义常数*/ InsertBST(bst, key); scanf(%d, &key); 4.二叉排序树的删除从二叉排序树中删除一个结点,必须保证删除后所得的二叉树仍然满足二叉排序树的性质不变。删除操作:首先确定被删除的结点是否在二叉排序树中。若不在 ,则不做任何操作;否则,假设要删除的结点为p,结点p的双亲结点为f,并假设结点p是结点f的左孩子(右孩子的情况类似)。下面分三种情况讨论:(1)若p为叶结点,则可直接将其删除: f-lchild

18、=NULL;free(p); (2)若p结点只有左子树,或只有右子树,则可将p的左子树或右子树直接改为其双亲结点f的左子树。即:f-lchild=p-lchild(或f-lchild=p-rchild);free(p); (3)若p既有左子树,又有右子树, 如下图(a),则处理的方法有两种:方法一:首先找到p结点在中序序列中的直接前驱s结点,如图 (b) 所示,然后将p的左子树改为f的左子树,而将p的右子树改为s的右子树:f-lchild=p-lchild;s-rchild= p-rchild;free(p);结果如图 (c) 所示。 方法二:首先找到p结点在中序序列中的直接前驱s结点,如图

19、(b) 所示,然后用s结点的值,替代p结点的值,再将s结点删除。即:原s结点的左子树改为s的双亲结点q的右子树:p-data=s-data;q-rchild= s-lchild;free(s);结果如图 (d) 所示。 例:从下图(a)的二叉排序树中依次删除11、13、插入13、删除5、删除9,画出每步操作后的二叉排序树。5.二叉排序树的查找分析在二叉排序树上的查找和折半查找类似,恰是走了一条从根到该结点的路径,和给定值比较的关键字个数不超过树的深度。含有n个结点的二叉排序树的平均查找长度和树的形态有关,而树的形态和初始序列有关。二叉排序树的各分支越均衡,树的深度浅,其平均查找长度ASL越小。

20、因此,二叉排序树查找的最好时间复杂度为O(log2n),最坏的时间复杂度为O(n),一般情形下,其时间复杂度大致可看成O(log2n),比顺序查找效率要好,但比二分查找要差。9.3.2平衡二叉树1.问题的提出为使二叉排序树的检索效率最高,就要使二叉排序树在插入和删除后仍能维持好的形态。2.平衡二叉树的概念平衡二叉树(balanced binary tree)是由阿德尔森一维尔斯和兰迪斯(Adelson-Velskii and Landis)于1962年首先提出的,所以又称为AVL树。一棵平衡二叉树或者是空树,或者是具有下列性质的二叉排序树: (1)左子树与右子树高度之差的绝对值小于等于1; (

21、2)左子树和右子树也是平衡二叉排序树。平衡因子BF(Balance Factor) :结点的左子树深度与右子树深度之差。3.非平衡二叉树的平衡处理 处理的原则: 对失去平衡的最小子树(最小不平衡子树)进行平衡化处理,使其变为平衡。设与插入结点最近、且平衡因子的绝对值超过1的祖先结点为A,则以A为根结点的子树称为最小不平衡子树。处理的方法:分四种情况处理:(1)LL型 的处理(左左型) 条件:A的左孩子的左子树上插入结点后,导致失衡。调整方法:(单右旋)。即以B为轴,对A做一次顺时针旋转。A成为B的右子树,而原来B的右子树则变成A的左子树。(2)RR型的处理 条件:A的右孩子的右子树上插入结点后

22、,导致失衡。调整方法:(单左旋)。即以B为轴,对A做一次逆时针旋转。A成为B的左子树,而原来B的左子树则变成A的右子树。(3)LR型的处理 条件:A的左孩子的右子树上插入结点后,导致失衡。调整方法:(先左旋后右旋)。即先以C为轴,对B做一次左旋,然后以C为轴,对A做一次右旋。(4)RL型的处理 条件:A的右孩子的左子树上插入结点后,导致失衡。调整方法:(先右旋后左旋)。即先以C为轴,对B做一次右旋,然后以C为轴,对A做一次左旋。实例: 例1:给定关键字序列(13,24,37,90,53),构造AVL树。 例2:给定关键字序列(5,3,4,7,6,8,2,1),构造AVL树。为什么当平衡的二叉排

23、序树因插入结点而失去平衡时,仅需对最小平衡子树进行平衡化处理即可? 由于平衡化处理后,以B或C为的新子树为平衡二叉树,且它的深度与插入之前以A为根的子树相同,因而不影响插入路径上的所有祖先结点的平衡度。4.平衡二叉树查找的分析。平衡二叉树本身就是一棵二叉排序树,故它的查找与二叉排序树完全相同。时间复杂度为O(logn)。9.3.3 B-树和B+树1. 问题的提出2. B-树的定义。 B-树(B树)是一种平衡的多路查找树。 一棵m阶的B-树,或是空树,或是满足以下条件的m叉树:(1)树中每个结点至多有m棵子树;(2)若根结点不是叶子结点,则至少有二棵子树;(3)除根结点外的所有非终端结点至少有m

24、/2棵子树;(4)所有结点包含信息(n,A0,K1,A1,Kn,An)其中Ki为关键字且有序,Ai为指向子树根结点的指针,Ai所指子树中所有结点的关键字均小于Ki+1,An所指子树中所有结点的关键字均大于Kn;(5)所有叶子结点都出现在同一层次上,并且不带信息(为空)。3. B-树的查找及分析。 例:在图9.14中查找47和23的过程。性能分析:在B-树是进行查找包含两种基本操作:(1)在B-树中找结点:通常在磁盘上进行;(2)在结点中找关键字:在内存中进行。因此在磁盘上进行查找的次数(即待查关键字所在结点在B-树是的层次数),是决定B-树查找效率的关键因素。含n个关键字的m阶B-树的最大深度

25、为logm/2(n+1)/2) + 1最坏的情况: O (logm/2n)4. B-树的插入。深度为h的m阶B树,首先检索到第h层,确定插入结点位置。 (1)若被插入结点中关键码个数小于m-1,则插入。 (2)若被插入结点中关键码个数等于m-1,则引起 结点“分裂”。例:在下面的3阶B-树中依次插入30、26、85和7。5. B-树的删除。 1)在最下层结点中删除一个关键字 当结点中的关键字数大于m/2 -1 时,可直接删除(关键字Ki和Ai)。 当结点中关键字数等于m/2-1时,如果其右(左)兄弟中关键字数目大于m/2 -1 ,则需将其兄弟结点中的最小(或最大)关键字上移至双亲结点中,而将其双亲结点中大于(或小于)且紧靠该上移关键字的关键字下移至被删关键字所在的结点中。 当最下层待

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1