第8章查找.ppt
《第8章查找.ppt》由会员分享,可在线阅读,更多相关《第8章查找.ppt(63页珍藏版)》请在麦多课文档分享上搜索。
1、第8章 查 找,查找是数据处理中经常使用的一种重要运算,查找算法的优劣对系统运行效率的影响非常大。静态查找表、动态查找表和哈希表是主要的查找技术。本章要点 查找的基本概念; 几种常见的静态查找表的查找算法; 二叉排序树的创建、查找和删除算法; 平衡二叉树的基本操作; 哈希函数的构造方法和哈希表的查找算法。,章节安排,8.1查找的基本概念 8.2静态表的查找 8.3动态表的查找 8.4散列表,8.1查找的基本概念,查找:又称检索,是指在查找表中查找满足一定条件的结点或记录。 查找方法:静态查找、动态查找 衡量查找算法优劣指标:最大查找长度、平均查找长度如对n个记录进行查找时,平均查找长度可表示为
2、:,8.2静态表的查找,静态查找表可分为顺序表、有序表和索引顺序表三种。,顺序表的查找基本思想是:从顺序表的一端开始,逐个比较结点的关键字和给定值,若某个结点的关键字与给定值相等,则查找成功;若找遍整个顺序表都不相等,则查找失败。查找成功时,查找算法返回找到结点在顺序表中的位置,失败时返回1。,8.2.1顺序表的查找,下面的算法描述了顺序查找过程。 顺序表的存储结构定义如下: typedef struct KeyType key; /*关键字的数据类型*/ DataType; /*数据元素的类型*/ typedef struct DataType *data;/*顺序表data*/int le
3、n; /*顺序表的长度*/Stable;,【算法8.1】顺序表查找算法 int Stable_Search(Stable S,KeyType key) /*在顺序表S中查找关键字等于key的结点*/int i;S.data0.key=key; /*设置哨兵*/i=S.len; /*设置初始查找位置*/while (S.datai.key!=key) i-; /*从后往前找*/if (i=0) return 1; /*查找失败*/else return i; /* 查找成功*/顺序查找的平均查找长度为:,二分法查找(Binary Search)又称为折半查找,其基本思想是:首先取查找表中间位置上
4、的结点的关键字与给定值进行比较,若相等,则查找成功;否则,如果给定值比中间位置上的结点的关键字大,则把查找区间定为表的后半段,反之把查找区间定为表的前半段;然后在前半段或后半段采用同样的方法继续查找,如此继续,直到找到关键字等于给定值的结点,则查找成功;若出现查找区间的左右边界异常,则查找失败。,8.2.2有序表的查找,例:已知有11个关键字的有序表序列如下所示: 02,08,15,23,31,37,42,49,67,83,91当给定的k值为23和83时,折半查找的过程如图所示。图中用方括号表示当前的查找区间,用“”指向中间位置。,【算法8.2】二分法查找非递归算法int Binary_Sea
5、rch(Stable S,KeyType key) int low,mid,high; low=1;high=S.len; while(lowS.datamid.key) low=mid+1; else return mid ;return 1;,索引顺序查找又称为分块查找,是顺序查找的一种改进方法。在索引顺序查找法中,除表本身以外,还需要建立一个“索引表”。分块查找的基本思想:把顺序表分成若干块,每一块中结点的存放是任意的,但是块与块之间必须有序。假设块间按关键字值递增排序,以每块中的最大(小)关键字值建立一个索引表,存放每块的最大(小)关键字值和每块的起始位置。查找时需分两步走,首先在索引
6、表中采用顺序查找或折半查找算法查找给定值,确定给定值所在的块;然后在所确定的块中顺序查找。,8.2.3索引顺序表的查找,例8.2 设有一个顺序表共有20个结点,现将它分成四块,每块5个结点。以每块最大关键字值建立索引表,索引表包含最大关键字值和对应块的起始地址两个域,如图8.2所示。试查找关键字值为58的结点。图8.2 表及索引表结构图,分块查找的平均查找长度:ASLbs=ASLb+ASLwASLbs表示分块查找的平均查找长度,ASLb表示查找索引表以确定所在块的平均查找长度,ASLw表示在块中查找关键字的平均查找长度。,8.3动态表的查找,动态查找表的特点是:表结构本身是在查找过程中动态生成
7、的,即对于给定值key,若表中存在关键字等于key的结点,则查找成功;否则插入关键字为key的结点。,二叉排序树又称二叉查找树,它或者是一棵空 树,或者是具有以下性质的二叉树:若任一结点的左子树非空,则左子树中的所有 结点的值都不大于根结点的值;若任一结点的右子树非空,则右子树中的所有 结点的值都不小于根结点的值。,8.3.1二叉排序树,例如:图8.3所示为一棵二叉排序树(结点内的数为数据元素的关键字)。其中序遍历序列为:15,55,65,75,79,95,100,120,200,230,240。,图8.3 二叉排序树,二叉排序树一般采用二叉链表作为存储结构,可定义如下:typedef str
8、uct BSTNodeDataType data; /*数据元素字段*/ struct BSTNode *lchild,*rchild; /*左、右指针字段*/ NodeType;,【算法8.3】二叉排序树查找算法 int BST_Search (NodeType *T,KeyType key,NodeType *p,NodeType *q) if (T) *p=T;*q=NULL;while(*p) if(key(*p)-data.key) *q=*p ;(*p)= (*p)-rchild; elseif(keydata.key) *q=*p ;(*p)= (*p)-lchild; else
9、 return 1 ; return 0; ,二叉排序树的插入和生成过程如下:(1) 若二叉排序树为空,则把待插入的结点作为根结点插入到空树中。(2) 若二叉排序树非空,则将待插入的结点关键字和根结点的关键字进行比较,若两者相等,表示该结点已在二叉排序树中,无需插入;若待插入的结点关键字小于根结点的关键字,将待插入的结点插入到根的左子树中,否则插入到右子树中。(3) 子树中的插入过程和树中的插入过程相同,如此插入下去,直到把待插入的结点作为叶子插入到二叉排序树中。,【算法8.4】二叉排序树的插入算法int InsertNode (NodeType *t,KeyType key) NodeTyp
10、e *p, *q,*s;if(!BST_Search (*t, key, s-data.key=key; s-lc=NULL;s-rc=NULL;if(!p) t=s; else if(keyp-data.key) p-rchild=s; else p-lchild=s; return 1;return 0;,例如,给定关键字序列53,80,69,45,58,30,88,则构造相对应的一棵二叉排序树的过程如图8.5所示:,图8.5 二叉排序树的插入过程 (a)空树;(b)插入53;(c)插入90;(d)插入69;(e)插入45;(f)插入58;(g)插入30;(h)插入88;,二叉排序树的删除
11、设待删结点的为p,p的双亲结点为d,若p的左右孩子分别为pl和pr,则删除操作可分以下三种情况进行讨论:(1)若结点p为叶子结点,则pl和pr均为空二叉树。由于删除叶子结点不会破坏整棵树的结构,则根据p是d的左子树还是右子树,将d的左孩子或右孩子指针域置空即可。删除过程如图8.6所示。,(2)若结点p只有左子树pl或右子树pr时,则用p的左子树的根结点pl或右子树的根结点pr取代被删除的结点即可。删除过程如图8.7所示。,(3)若结点p同时有左右子树pl和Pr时,则用被删除结点的左子树的根取代被删除的结点,将被删除结点的右子树移动到被删除结点的左子树的最右下方,即用结点pl取代结点p,将Pr及
12、其子树移动到pl的右子树的最右下方,如图8.8所示。,【算法8.5】二叉排序树的删除算法 int DeleteNode(NodeType *t,KeyType key) /* 在二叉排序树t中若存在关键字值为key的结点则删除,函数返回1,否则返回0*/ NodeType *p,*d,*s; if(BST_Search (*t,key,/*被删除结点无左子树,将其右子树作为删除此结点后的树*/,(续) else /*被删除结点有左子树,将其左子树作为根结点*/*t=p-lchild;s=*t;/*寻找被删除结点左子树的最右下结点*/while (s-rchild!=NULL) s=s-rchi
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 查找 PPT
