(8)--lecture8数据结构数据结构.ppt





《(8)--lecture8数据结构数据结构.ppt》由会员分享,可在线阅读,更多相关《(8)--lecture8数据结构数据结构.ppt(138页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 查查找是使用广泛的技找是使用广泛的技术术,本章,本章强调强调以算法分析的以算法分析的结结论论来来审视审视各种各种查查找方法。找方法。查查找表有多种找表有多种类类型,也有着各异的型,也有着各异的查查找方法,找方法,对应对应着各自的使用范筹,将其运用到的恰当着各自的使用范筹,将其运用到的恰当场场合是学合是学习查习查找表的精髓。找表的精髓。哈希哈希查查找表在数据加密、金融服找表在数据加密、金融服务领务领域日益受到倚域日益受到倚重,是本章学重,是本章学习习的重点之一。的重点之一。讲讲授本章授本章课课程大程大约约需需4 4课时课时。第第9章章 查找找2v 查找表的基本概念找表的基本概念v 9.1 静
2、静态查态查找表找表v 9.2 动态查找表找表v 9.3 哈希表及其哈希表及其查找找3查找表的基本概念查找表的基本概念 4何何谓查找表找表?查找表是由同一同一类型型的数据元素(或记录)构成的集合集合。由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。5对查找表经常进行的对查找表经常进行的操作操作:1)查询某个“特定的”数据元素是否在查找表中;2)检索某个“特定的”数据元素的各种属性;3)在查找表中插入一个数据元素;4)从查找表中删去某个数据元素。6仅作查询和检索操作的查找表。静静态查找表找表有时在查询之后,还需要将“查询”结果为“不在查找表中”的数据元素插入到查找表中
3、;或者,从查找表中删除其“查询”结果为“在查找表中”的数据元素。动态查找表找表查找表可分为两类:7 是数据元素(或记录)中某个数据数据项的值,用以标识(识别)一个数据元素(或记录)。关关键字字 若此关键字可以识别唯一的唯一的一个记录,则称之谓“主关主关键字字”。若此关键字能识别若干若干记录,则称之谓“次关次关键字字”。8 根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)。查找找 若查找表中存在这样一个记录,则称“查找成功找成功”。查找结果给出整个记录的信息,或指示该记录在查找表中的位置;否则称“查找不成功找不成功”。查找结果给出“空记录”或“空指针”。9 由于查找表中
4、的数据元素之间不存在明显的组织规律,因此不便于查找。为了提高查找的效率,需要在查找表中的元素之间人人为地附加地附加某种确定的关系,换句话说,用另外一种用另外一种结构来表示构来表示查找表找表。如何如何进行行查找?找?查找的方法取决于找的方法取决于查找表的找表的结构。构。109.1 静静 态态 查查 找找 表表11 查找表具有相同特性的数据元素的集合。每个数据元素含有每个数据元素含有类型相型相同的关同的关键字字,可唯一标识数据元素。查找表找表的定的定义12Create(&ST,n);Destroy(&ST);Search(ST,key);Traverse(ST);静静态查找表找表的基本操作的基本操
5、作:13构造一个含n个数据元素的静态查找表ST。Create(&ST,n);操作结果:14销毁表ST。Destroy(&ST);初始条件:操作结果:静态查找表ST存在;15若 ST 中存在其关键字等于 key 的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。Search(ST,key);初始条件:操作结果:静态查找表ST存在,key 为和查找表中元素的关键字类型相同的给定值;16按某种次序输出ST中的每个数据元素。Traverse(ST);初始条件:操作结果:静态查找表ST已存在。17typedef struct /数据元素存储空间基址,建表时 /按实际长度分配,0号单元留空 i
6、nt length;/表的长度 SSTable;静静态查找表找表的的顺序存序存储结构:构:ElemType*elem;18数据元素数据元素类型型的定的定义为:typedef struct keyType key;/关键字域 /其它属性域 ElemType;,TElemType;19一、一、顺序序查找表找表二、有序二、有序查找表找表三、索引三、索引顺序表序表20 以顺序表或线性链表表示静态查找表一、顺序序查找表找表21ST.elemiST.elemi60ikey=64key=60i64从高端开始查找查找不成功,定位在0下标22int Search_Seq(SSTable ST,KeyType k
7、ey)/在顺序表ST中顺序查找其关键字等于 /key的数据元素。若找到,则函数值为 /该元素在表中的位置,否则为0。ST.elem0.key=key;/“哨兵”for(i=ST.length;ST.elemi.key!=key;-i);/从后往前找 return i;/找不到时,i为0/Search_Seq23 定定义:查找算法的平均平均查找找长度度ASL (Average Search Length)为确定记录在查找表中的位置,需和给定值 进行比较的关键字个数的期望值 其中:n 为表长,Pi 为查找表中第i个记录的概率,且 ,Ci为找到该记录时,曾和给定 值比较过的关键字的个数。分析顺序查找
8、的时间性能24在等概率查找的情况下,顺序表查找的平均查找长度为:对顺序表序表而言,Ci=n-i+1ASL=nP1+(n-1)P2+2Pn-1+Pn25 上述顺序查找表的查找算法简单,但平均查找长度较大,特别不适用于表长较大的查找表。二、有序二、有序查找表找表 若以有序表有序表表示静态查找表,则查找过程可以基于“折半折半”进行。26ST.elemST.length例如例如:key=64 的查找过程如下:lowhighmidlow mid high midlow 指示查找区间的下界high 指示查找区间的上界mid=(low+high)/227int Search_Bin(SSTable ST,K
9、eyType key)low=1;high=ST.length;/置区间初值 while(low=high)mid=(low+high)/2;if(key=ST.elemmid.key)return mid;/找到待查元素 else if(key 50时,可得近似结果 一般情况下,表长为 n 的折半查找的判定树的深度和含有 n 个结点的完全二叉树的深度相同。30三、索引顺序表三、索引顺序表索引顺序表的查找过程:1)由索引确定记录所在区间;2)在顺序表的某个区间内进行查找。31 注意:索引可以根据查找表的特点来构造。索引顺序查找的过程也是一个“缩小区间”的查找过程。32索引顺序查找的平均查找长度
10、=查找“索引”的平均查找长度+查找“顺序表”的平均查找长度33分分块查找找ASLbs=Lb+Lw349.2 动动 态态 查查 找找 表表35InitDSTable(&DT)动态查找表找表的基本操作的基本操作:DestroyDSTable(&DT)SearchDSTable(DT,key);InsertDSTable(&DT,e);DeleteDSTable(&T,key);TraverseDSTable(DT);36操作结果:构造一个空的动态查找表DT。InitDSTable(&DT);37销毁动态查找表DT。DestroyDSTable(&DT);初始条件:操作结果:动态查找表DT存在;38
11、若DT中存在其关键字等于 key的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。SearchDSTable(DT,key);初始条件:操作结果:动态查找表DT存在,key为和关键字类型相同的给定值;39动态查找表DT存在,e 为待插入的数据元素;InsertDSTable(&DT,e);初始条件:操作结果:若DT中不存在其关键字等于 e.key 的 数据元素,则插入 e 到DT。40动态查找表DT存在,key为和关键字类型相同的给定值;DeleteDSTable(&T,key);初始条件:操作结果:若DT中存在其关键字等于key的数据元素,则删除之。41动态查找表DT存在。Tra
12、verseDSTable(DT)初始条件:操作结果:按某种次序输出ST中的每个数据元素。42(n)(1)(n)(1)(nlogn)综合上一合上一节讨论的几种的几种查找表的特性:找表的特性:查找找 插入插入 删除除无序顺序表 无序线性链表有序顺序表 有序线性链表 静态查找树表(n)(n)(logn)(n)(logn)(1)(1)(n)(1)(nlogn)431)从查找性能看,最好情况能达(logn),此时要求表有序;2)从插入和删除的性能看,最好情况能达(1),此时要求存储结构是链表。可得如下可得如下结论:动态查找表找表可以可以综合以上两点,构建合以上两点,构建自己的自己的结构。构。44一、二叉
13、排序一、二叉排序树 (二叉(二叉查找找树)二、二叉平衡二、二叉平衡树三、三、键 树(1)若它的左子树不空,则左子树上 所有结点的值均小于根结点的值;1定定义:二叉排序树或者是一棵空树;或者是具有如下特性的二叉树:(3)它的左、右子树也都分别是二叉 排序树。(2)若它的右子树不空,则右子树上 所有结点的值均大于根结点的值;503080209010854035252388例如例如:是二叉排序是二叉排序树。66不不 通常,取二叉链表作为二叉排序树的存储结构typedef struct BiTNode /结点点结构构 struct BiTNode *lchild,*rchild;/左右孩子指针 BiT
14、Node,*BiTree;TElemType data;48一、二叉排序一、二叉排序树(二叉(二叉查找找树)1查找算法找算法2插入算法插入算法3删除算法除算法4查找性能的分析找性能的分析491.二叉排序树的查找算法二叉排序树的查找算法1)若)若给定定值等于根根结点的关点的关键字,字,则查找 成功;2)若)若给定定值小于根根结点的关点的关键字,字,则继续 在左子树上进行查找;3)若)若给定定值大于根根结点的关点的关键字,字,则继续 在右子树上进行查找。若二叉排序树为空空,则查找不成功找不成功;否则,5050308020908540358832例如例如:二叉排序二叉排序树查找关找关键字字=50,5
15、05035,503040355090,5080909551从上述查找过程可见,在查找过程中,生成了一条查找路径找路径:从根结点出发,沿着左分支或右分支逐层向下直至关键字等于给定值的结点;或者 从根结点出发,沿着左分支或右分支逐层向下直至指针指向空树为止。查找成功找成功 查找不成功找不成功52bool Search_BST(BiTree T,KeyType kval,BiTree&p,BiTree&f)/无论查找成功与否,f 总是指向 T 所指结点的双亲,/其初始调用值为NULL p=T;/p 指向树中某个结点,f指向其双亲结点 while(p)if(kval=p-data.key)return
16、 TRUE;/查找成功 else if(kval data.key)f=p;p=p-lchild;/在左子树中继续查找 else f=p;p=p-rchild;/在右子树中继续查找 /while return FALSE;/查找不成功/SearchBST53v 根据根据动态查找表的定找表的定义,“插入”操作在 查找不成功时才进行;2.二叉排序树的插入算法二叉排序树的插入算法v 若二叉排序若二叉排序树为空树,则新插入的新插入的结点点为 新的根结点;否;否则,新插入的,新插入的结点必点必为一一 个个新的叶子结点,其,其插入位置由由查找找过程程 得到。得到。5430201040352523fT设 k
17、ey=48fTfT22fTfTTTTfff注意:注意:f 总是指向遍历指针结点的双亲 将为插入和删除操作确定具体位置 查找不到的情况:找不到的情况:55bool Insert_BST(BiTree&T,ElemType e)/当二叉查找树中不存在关键字等于e.key的数据元素时,/插入e并返回TRUE,否则不再插入并返回FALSE f=NULL;if(Search_BST(T,e.key,p,f)return FALSE;/树中已有关键字相同的结点,不再插入 else /查找不成功,插入结点 s=new BiTNode;s-data=e;s-lchild=s-rchild=NULL;if(!f
18、)T=s;/空树时,插入的s 结点为新的根结点 else if(e.key data.key)f-lchild=s;/插入 s 结点为左孩子 else f-rchild=s;/插入 s 结点为右孩子 return TRUE;/else/Insert_BST561.被删除的结点是叶子;2.被删除的结点只有左子树或者只有右子树;3.被删除的结点既有左子树,也有右子树。3二叉排序二叉排序树的的删除算法除算法可分三种情况讨论:和插入相反,删除在查找成功找成功之后进行,并且要求在删除二叉排序树上某个结点之后,仍然保持二叉排序仍然保持二叉排序树的特性的特性。5750308020908540358832(1
19、)被删除的结点是叶子叶子结点点例如例如:被被删关关键字字=2088其双亲结点中相应指针域的值改为“空空”5850308020908540358832(2)被删除的结点只有左子只有左子树或者只有右子只有右子树 其双亲结点的相应指针域的值改为“指向被删除结点的左子树或右子树”。被被删关关键字字=40805950308020908540358832(3)被)被删除的除的结点点既有左子既有左子树,也有右子,也有右子树4040以其前驱替代之,然后再删除该前驱结点被删结点前驱结点被被删关关键字字=5060void Delete_BST(BiTree&T,KeyType kval)/若二叉查找树T中存在 /
20、关键字等于kval的数据元素,则删除之。f=NULL;if(Search_BST(T,kval,p,f)/找到其关键字等于kval的数据元素 左、右子树均不空,找p的前驱再改动链接;右子树空,只需挂接它的左子树;左子树空,只需挂接它的右子树;/将指针p所指子树挂接到 /被删结点的双亲结点f Status DeleteBST(BiTree&T,KeyType key)/若二叉排序若二叉排序树 T 中存在其关中存在其关键字等于字等于 key 的的 /数据元素,数据元素,则删除除该数据元素数据元素结点,并返回点,并返回 /函数函数值 TRUE,否,否则返回函数返回函数值 FALSE if(!T)re
21、turn FALSE;/不存在关键字等于key的数据元素 else /DeleteBST算法描述如下:算法描述如下:if(EQ(key,T-data.key)/找到关键字等于key的数据元素else if(LT(key,T-data.key)else Delete(T);return TRUE;DeleteBST(T-lchild,key);/继续在左子树中进行查找DeleteBST(T-rchild,key);/继续在右子树中进行查找void Delete(BiTree&p)/从二叉排序树中删除结点 p,/并重接它的左子树或右子树 if(!p-rchild)else if(!p-lchild
22、)else /Delete其中删除操作除操作过程如下所描述:/右子树为空树则只需重接它的左子树q=p;p=p-lchild;free(q);pp/左子树为空树只需重接它的右子树q=p;p=p-rchild;free(q);ppq=p;s=p-lchild;while(s-rchild)q=s;s=s-rchild;/s 指向被删结点的前驱/左右子树均不空p-data=s-data;if(q!=p)q-rchild=s-lchild;else q-lchild=s-lchild;/重接*q的左子树free(s);pqs674查找性能的分析找性能的分析 对于每一棵特定的二叉排序树,均可按照平均查找
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lecture8 数据结构

限制150内