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

上传人:b****6 文档编号:5954003 上传时间:2023-01-02 格式:DOCX 页数:28 大小:40.97KB
下载 相关 举报
数据结构授课教案第8章查找.docx_第1页
第1页 / 共28页
数据结构授课教案第8章查找.docx_第2页
第2页 / 共28页
数据结构授课教案第8章查找.docx_第3页
第3页 / 共28页
数据结构授课教案第8章查找.docx_第4页
第4页 / 共28页
数据结构授课教案第8章查找.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

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

《数据结构授课教案第8章查找.docx》由会员分享,可在线阅读,更多相关《数据结构授课教案第8章查找.docx(28页珍藏版)》请在冰豆网上搜索。

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

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

山东轻工业学院

教师授课教案

 

课程名称:

数据结构(计科)

课程代码:

0301306

学分:

4.5

课程类别:

必修

开课单位:

信息科学与技术学院

授课班级:

授课教师:

杨春花

 

山东轻工业学院教务处制

授课时间

年月日星期第节

年月日星期第节

年月日星期第节

授课内容概要

第八章查找

第一节静态查找表

查找的基本概念和术语;静态查找表的存储结构表示;顺序查找的过程、算法和性能分析;折半查找的过程、算法和性能分析;分块查找的过程和分析。

第二节动态查找表

二叉排序树的定义;二叉排序树的查找、插入和删除;二叉排序树的查找分析;平衡二叉树的定义和平衡化的方法;B-树的定义、查找和查找分析、插入和删除,B+树的概念。

第三节哈希表

哈希表、哈希函数、哈希地址、同义词等概念;哈希函数的构造方法;处理冲突的方法;哈希表的构造;哈希表的存储结构、查找算法和分析。

目的要求

目的:

理解查找的基本方法。

基本要求:

了解平衡二叉树的平衡化方法、B树的插入和删除和键树的概念;理解分块查找的基本思想、哈希表的基本概念、哈希函数的构造方法和处理冲突的方法;掌握查找的基本概念、顺序查找和折半查找的基本思想和算法、二叉排序树的概念和基本操作和哈希表的构造方法。

顺序查找和折半查找的思想、算法和分析;二叉排序树的概念、构造、插入和删除;B-树的插入和删除方法;哈希表的基本概念和哈希表的构造方法。

折半查找的算法和分析;二叉排序树的插入和删除;平衡二叉树的平衡化方法;B-树的插入和删除方法;哈希表的构造方法。

作业布置

习题9

参考书

1.数据结构题集(C语言版),严蔚敏,清华大学出版社,2002。

3.数据结构、算法与应用-C++语言描述,(美)SartajSahni著,汪诗林等译,机械工业出版社,2002。

课型

理论课

复习

分钟

主要教具

投影、黑板

讲授

分钟

教学方法

讲解、提问、示例

指导

分钟

教学手段

板书、课件

总结

分钟

备注

共10学时,其中2学时为习题课

注:

课型一栏填写理论课、实验课、习题课等

授课内容

备注

第9章查找

9.1基本概念和术语

1数据项(也称项或字段):

是具有独立含义的标识单位,是数据不可分割的最小单位。

2组合项

由若干项、组合项构成。

3数据元素(记录)

是由若干项、组合项构成的数据单位,是在某一问题中作为整体进行考虑和处理的基本单位。

4关键码(key)

关键码是数据元素(记录)中某个项或组合项的值,用它可以标识一个数据元素(记录)。

能唯一确定一个数据元素(记录)的关键码,称为主关键码(PrimaryKey);不能唯一确定一个数据元素(记录)的关键码,称为次关键码(SecondaryKey)。

5查找表(SearchTable)

是由具有同一类型(属性)的数据元素组成的集合(又称为字典)。

分为静态查找表和动态查找表两类:

静态查找表(StaticSearchTable):

仅对查找表进行查找操作,而不能改变的表;

动态查找表(DynamicSearchTable):

对查找表除进行查找操作外,允许向表中插入或删除表中数据元素的表。

6.查找(searching)

按给定的某个值kx,在查找表中确定一个其关键码等于kx的数据元素(记录)。

7数据元素类型说明

typedefstruct{/*出生日期类型定义*/

charyear[5];/*年:

用字符型表示,宽度为4个字符*/

charmonth[3];/*月:

字符型,宽度为2*/

chardate[3];/*日:

字符型,宽度为2*/

}BirthDate;

typedefstruct{/*数据元素类型定义*/

charnumber[7];/*学号:

字符型,宽度为6*/

charname[9];/*姓名:

字符型,宽度为8*/

charsex[3];/*性别:

字符型,宽度为2*/

BirthDatebirthdate;/*出生日期:

构造类型*/

charcomefrom[21];/*来源:

字符型,宽度为20*/

intresults;/*成绩:

整型,宽度由“C语言”决定*/

}ElemType;

8查找表的类型定义

例:

用线性表表示查找表:

(1)用顺序表来表示查找表:

typedefMAXSIZE1000

typedefstruct{//顺序存储结构

ElemTypeelem[MAXSIZE+1];

intlength;

}SStable;

(2)用单链表表示查找表

typedefstructLNode{

ElemTypedata;structLNode*next;

}LNode,*LinkList;

用其它形式表示的线性表的类型定义在以后的章节中解释。

说明:

本章以后讨论中,涉及的关键码类型和数据元素类型统一说明如下:

typedefstruct{

KeyTypekey;/*关键码字段,可以是整型、字符型、构造型等*/

……/*其它字段*/

}ElemType;

9.2静态查找表

9.2.1静态查找表结构

静态查找表是数据元素的线性表,可以是基于数组的顺序存储或以线性链表存储。

typedefMAXSIZE1000

typedefstruct{//顺序存储结构

ElemTypeelem[MAXSIZE+1];

intlength;

}SStable;

typedefstructLNode{//链式存储结构

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

9.2.2顺序查找(SequentialSearch)

查找方法:

从表的一端开始,向另一端逐个按给定值kx与关键码进行比较,若找到,查找成功,并给出数据元素在表中的位置;若整个表检测完,仍未找到与kx相同的关键码,则查找失败,给出失败信息。

例:

给定kx=56,90,在下表中进行顺序查找。

//不设置监视哨的顺序查找算法

intsearch_Seq(SSTableST,KeyTypekx)

{

i=l.length;

while(i>=1&&ST.elem[i].key!

=kx)i--;

returni;

}

【算法9.1】以顺序存储为例,数据元素从下标为1的数组单元开始存放,0号单元留空。

intsearch_Seq(SSTableST,KeyTypekx)

{/*在表tbl中查找关键码为kx的数据元素,若找到返回该元素在数组中的下标,否则返回0*/

ST.elem[0].key=kx;/*监视哨*/

for(i=ST.length;ST.elem[i].key!

=kx;i--);

returni;

}

【性能分析】

分析查找算法的效率,通常用平均查找长度ASL来衡量。

定义:

在查找成功时,平均查找长度ASL是指为确定数据元素在表中的位置所进行的关键码比较次数的期望值。

其中:

Pi为表中第i个数据元素的查找概率,Ci为表中第i个数据元素的关键码与给定值kx相等时,按算法定位关键码的比较次数。

对一个含n个数据元素的表,查找成功时,顺序查找的平均查找长度为:

查找不成功时,关键码的比较次数总是n+1次。

算法中的基本工作就是关键码的比较,因此,查找长度的量级就是查找算法的时间复杂度,其为O(n)。

顺序查找

缺点:

当n很大时,平均查找长度较大,效率低;

优点:

是对表中数据元素的存储没有要求。

另外,对于线性链表,只能进行顺序查找。

9.2.3有序表的折半查找

条件:

要求待查找的列表必须是按关键字大小有序排列的顺序表。

基本过程:

将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。

重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

例:

已知含11个元素的有序表(关键字即为数据元素的值):

(05,13,19,21,37,56,64,75,80,88,92)

查找关键字21和85的数据元素。

【算法9.2】intSearch_Bin(SSTableST,KeyTypekx){

low=1;high=ST.length;

while(low<=high){

mid=(low+high)/2;

if(kx==ST.elem[mid].key)

returnmid;

elseif(kx

low=mid+1;

else

high=mid-1;

}

return0;

}

【性能分析】

折半查找过程可用一棵判定树来描述。

判定树中每一结点对应表中一个记录,但结点值不是记录的关键字,而是记录在表中的位置序号。

根结点对应当前区间的中间记录,左子树对应前一子表,右子树对应后一子表。

例:

对于下面有序表进行折半查找的判定树如下:

(05,13,19,21,37,56,64,75,80,88,92)

查找表中任一元素的过程,即是判定树中从根到该元素结点路径上各结点关键码的比较次数,也即该元素结点在树中的层次数。

对于n个结点的判定树,树高为k,则有k<=┗log2n┛+1。

因此,折半查找在查找成功时,所进行的关键码比较次数至多为┗log2n┛+1。

查找失败时和给定值进行比较的关键字的个数也超不过┗log2n┛+1。

折半查找成功时的平均查找长度为:

折半查找的时间复杂度为O(logn)

优点:

比较次数少,查找速度快,平均性能好。

缺点:

要求待查的表为有序顺序表,插入、删除不方便。

9.2.4索引顺序表的查找(分块查找)

索引顺序表的组织:

首先将列表分成若干个块(子表)。

一般情况下,块的长度均匀,最后一块可以不满。

每块中元素任意排列,即块内无序,但块与块之间有序。

构造一个索引表。

其中每个索引项对应一个块并记录每块的起始位置,和每块中的最大关键字(或最小关键字)。

索引表按关键字有序排列。

例:

下图为一个索引顺序表

分块查找的基本过程为:

1)首先,将待查关键字K与索引表中的关键字进行比较,以确定待查记录所在的块。

具体的可用顺序查找法或折半查找法进行。

2)进一步用顺序查找法,在相应块内查找关键字为K的元素。

分块查找的平均查找长度由两部分组成:

即查找索引表时的平均查找长度为LB,以及在相应块内进行顺序查找的平均查找长度LW。

ASLbs=LB+LW

假定将长度为n的表分成b块,且每块含s个元素,则b=n/s。

又假定表中每个元素的查找概率相等,则每个索引项的查找概率为1/b,块

中每个元素的查找概率为1/s。

若用顺序查找法确定待查元素所在的块,则有:

若用顺序查找法确定待查元素所在的块,则有:

当s=

时,ASLbs取最小值

+1。

若用顺序查找法确定待查元素所在的块,则有:

ASLbs=LB+LW=log2(b+1)/2-1+(s+1)/2

≈log2(n/s+1)+s/2

9.3.1二叉排序树

1.二叉排序树定义

二叉排序树(BinarySortTree)或者是一棵空树;或者是具有下列性质的二叉树:

 

(1)若左子树不空,则左子树上所有结点的值均小于根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于根结点的值。

(3)左右子树也都是二叉排序树。

二叉排序树又称为二叉查找树。

由定义可知,对二叉排序树进行中序遍历,可得到一个按关键码递增有序的序列。

例:

下面的树不是二叉排序树

2.二叉排序树上的查找

从其定义可见,二叉排序树的查找过程为:

 ①若查找树为空,查找失败。

 ②查找树非空,将给定值kx与查找树的根结点关键码比较。

 ③若相等,查找成功,结束查找过程,否则,

a.当kx小于根结点关键码,查找将在左子树上继续进行,转①

b.当kx大于根结点关键码,查找将在右树上继续进行,转①

例:

在下面的二叉排序树中查找关键字等于100、40的记录。

二叉排序树(查找表)的类型定义:

typedefintKeyType;//设关键字的类型可直接进行比较

typedefstruct node{

KeyType key;/*关键字的值*/

……/*其它字段的值*/

 structnode *lchild,*rchild;/*左右指针*/

}BitNode,*BiTree;

递归算法:

BiTreeSearchBST(BiTreeT,KeyTypekey){

if(!

T)||(T->key==key)returnT;/*查找成功*/

elseif(keykey)

returnSearchBST(T->lchild,key);

else

returnSearchBST(T->rchild,key);

}

非递归算法:

BiTreeSearchBST(BiTreeT,KeyTypekey){

p=T;

while(P){

if(p->key==key)

returnp;/*查找成功*/

elseif(keykey)

p=p->lchild;

else

p=p->rchild;

}

returnNULL;/*查找失败*/

}/*SearchBST*/

3.二叉排序树的插入和生成

二叉排序树中插入一个结点:

设待插入结点的关键码为kx,先在二叉排序树中进行查找,若查找成功,不用插入;查找不成功时,则插入之。

因此,新插入结点一定是作为叶子结点添加上去的。

构造一棵二叉排序树则是逐个插入结点的过程。

例:

记录的关键码序列为:

63,90,70,55,67,42,98,83,10,45,58,则构造的一棵二叉排序树为:

二叉排序树中插入结点的递归算法:

voidInsertBST(BiTree&T,KeyTypekey){

if(T==NULL){

s=(BiTree)malloc(sizeof(BitNode));

s->key=key;s->lchild=NULL;s->rchild=NULL;T=s;

}

elseif(keykey)

InsertBST(T->lchild,key);

elseif(key>T->key)

InsertBST(T->rchild,key);

}

二叉排序树中插入结点的非递归算法:

voidInsertBST(BiTree&T,KeyTypekey){

p=NULL;q=T;

while(q!

=NULL){

if(kx==q->key)return;

elseif(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;

elseif(keykey)p-lchild=key;

elsep-rchild=key;

}

创建二叉排序树的算法:

voidCreateBST(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=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结点,如图(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越小。

因此,二叉排序树查找的最好时间复杂度为O(log2n),最坏的时间复杂度为O(n),一般情形下,其时间复杂度大致可看成O(log2n),比顺序查找效率要好,但比二分查找要差。

9.3.2平衡二叉树

1.问题的提出

为使二叉排序树的检索效率最高,就要使二叉排序树在插入和删除后仍能维持好的形态。

2.平衡二叉树的概念

平衡二叉树(balancedbinarytree)是由阿德尔森一维尔斯和兰迪斯(Adelson-VelskiiandLandis)于1962年首先提出的,所以又称为AVL树。

一棵平衡二叉树或者是空树,或者是具有下列性质的二叉排序树:

(1)左子树与右子树高度之差的绝对值小于等于1;

(2)左子树和右子树也是平衡二叉排序树。

平衡因子BF(BalanceFactor):

结点的左子树深度与右子树深度之差。

3.非平衡二叉树的平衡处理

处理的原则:

对失去平衡的最小子树(最小不平衡子树)进行平衡化处理,使其变为平衡。

设与插入结点最近、且平衡因子的绝对值超过1的祖先结点为A,则以A为根结点的子树称为最小不平衡子树。

处理的方法:

分四种情况处理:

(1)LL型的处理(左左型)

条件:

A的左孩子的左子树上插入结点后,导致失衡。

调整方法:

(单右旋)。

即以B为轴,对A做一次顺时针旋转。

A成为B的右子树,而原来B的右子树则变成A的左子树。

(2)RR型的处理

条件:

A的右孩子的右子树上插入结点后,导致失衡。

调整方法:

(单左旋)。

即以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树。

为什么当平衡的二叉排序树因插入结点而失去平衡时,仅需对最小平衡子树进行平衡化处理即可?

由于平衡化处理后,以B或C为的新子树为平衡二叉树,且它的深度与插入之前以A为根的子树相同,因而不影响插入路径上的所有祖先结点的平衡度。

4.平衡二叉树查找的分析。

平衡二叉树本身就是一棵二叉排序树,故它的查找与二叉排序树完全相同。

时间复杂度为O(logn)。

9.3.3B-树和B+树

1.问题的提出

2.B-树的定义。

B-树(B树)是一种平衡的多路查找树。

一棵m阶的B-树,或是空树,或是满足以下条件的m叉树:

(1)树中每个结点至多有m棵子树;

(2)若根结点不是叶子结点,则至少有二棵子树;

(3)除根结点外的所有非终端结点至少有┌m/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-树的最大深度为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