检索查找技术教学讲座PPT.ppt
《检索查找技术教学讲座PPT.ppt》由会员分享,可在线阅读,更多相关《检索查找技术教学讲座PPT.ppt(76页珍藏版)》请在三一办公上搜索。
1、第九章 查找技术,课前思考题:猜价格游戏:已知主持人手中物品价格为1至31元之间的整数,猜中者可得到该奖品。1.如果你猜错时主持人只告诉你所猜价格错了让你重新猜,平均要几次才能猜对?2.如果你猜错时主持人告诉你所猜价格是高了还是低了再让你重新猜,最少要几次才可以保证对任意一个价格都能猜对?,9.1.1 查找的基本概念,关键码:可以标识一个记录的某个数据项。,键值:关键码的值。主关键码:可以唯一地标识一个记录的关键码。次关键码:不能唯一地标识一个记录的关键码。,查找:在具有相同类型的记录构成的集合中找出满足给定条件的记录。,查找的结果:若在查找集合中找到了与给定值相匹配的记录,则称查找成功;否则
2、,称查找查找失败。,概述,静态查找:不涉及插入和删除操作的查找。,动态查找:涉及插入和删除操作的查找。,查找结构:面向查找操作的数据结构。,本章讨论的查找结构:线性表:适用于静态查找,主要采用顺序查找技术、折半查找技术。树表:适用于动态查找,主要采用二叉排序树的查找技术。散列表:静态查找和动态查找均适用,主要采用散列技术。,概述,9.1.2 查找算法的性能,查找算法时间性能通过关键码的比较次数来度量。,算法;问题规模;待查关键码在查找集合中的位置。,查找算法的时间复杂度是问题规模n和待查关键码在查找集合中的位置k的函数,记为T(n,k)。,概述,将查找算法进行的关键码的比较次数的数学期望值定义
3、为平均查找长度ASL。计算公式为:,ASL,其中:n:问题规模,查找集合中的记录个数;pi:查找第i个记录的概率;ci:查找第i个记录所需的关键码的比较次数。,概述,例:某班级30人,按姓名先后次序查找某人,则其查找成功的平均查找长度为:,查找失败的情况?,概述,线性表,9.2.1 顺序查找(线性查找),基本思想:从线性表的一端向另一端逐个将关键码与给定值进行比较,若相等,则查找成功,给出该记录在表中的位置;若整个表检测完仍未找到与给定值相等的关键码,则查找失败,给出失败信息。,1.顺序表的顺序查找,20 10 15 24 6 12 35 40 98 5,0 1 2 3 4 5 6 7 8 9
4、,查找方向,2.改进算法设置“哨兵”。哨兵就是待查值,将它放在查找方向的“尽头”处,免去了在查找过程中每一次比较后都要判断查找位置是否越界,从而提高查找速度。,伪代码1.设置哨兵k(置于查找方向的“尽头”);2.设置查找的起始下标;3.若ri与k相等,则返回当前i的值;否则,继续比较下一个记录;,线性表,0 1 2 3 4 5 6 7 8 9 10 11,5 13 19 21 37 56 64 75 80 88 92,找64,64,哨兵,比较次数=5,比较次数:查找第n个元素:1查找第n-1个元素:2.查找第1个元素:n查找第i个元素:n+1-i查找失败:n+1,平均查找长度?ASL=(1+2
5、+3+n)/n=(n+1)/2=O(n),线性表,/*/*线性表检索用的头文件 文件名:seqlist.h*/*/#include#define maxsize 100/*预定义最大的数据域空间*/typedef int datatype;/*假设数据类型为整型*/typedef struct datatype datamaxsize;int len;/*线性表长度*/seqlist;/*预定义的顺序表类型*/,线性表,算法9.1给出了基于顺序查找表的顺序检索方法。/*顺序检索算法 文件名:s_search.c*/*函数名:seqsearch1()、seqsearch2()*/#include
6、 seqlist.h/*-顺序查找的非递归实现-*/int seqsearch1(seqlist l,datatype key)int k=l.len-1;while(k=0,线性表,/*-顺序查找的递归实现-*/int seqsearch2(seqlist l,int n,datatype key)int k=0;if(n=-1)k=-1;else if(l.datan=key)k=n;else k=seqsearch2(l,n-1,key);return(k);算法9.1 线性表的顺序检索(顺序存储),线性表,9.2.2 二分法检索,二分法检索又称为折半查找,采用二分法检索可以大大提高查找
7、效率,它要求线性表结点按其关键字从小到大(或从大到小)按序排列并采用顺序存储结构。,采用二分搜索时,先求位于搜索区间正中的对象的下标mid,用其关键码与给定值x比较:x=lmid.Key,搜索成功;x lmid.Key,把搜索区间缩小到表的后半部分。,线性表,下面分析在其中二分检索关键字20的过程,线性表,每比较一次,搜索区间缩小一半。如果搜索区间已缩小到一个对象,仍未找到想要搜索的对象,则搜索失败。,例:有一组有序的线性表如下:(10,14,20,32,45,50,68,90,100,120),分析二分检索关键字95的过程:,线性表,例:有一组有序的线性表如下:(10,14,20,32,45
8、,50,68,90,100,120),下面给出二分检索法的非递归与递归实现算法,算法中使用seqlist.h中定义的顺序查找表。,/*/*二分查找算法 文件名:b_search.c*/*函数名:binsearch1()、binsearch2()*/*/*-二分查找的非递归实现-*/int binsearch1(seqlist l,datatype key)int low=0,high=l.len-1,mid;while(low=high),线性表,mid=(low+high)/2;/*二分*/if(l.datamid=key)return mid;/*检索成功返回*/if(l.datamidk
9、ey)high=mid-1;/*继续在前半部分进行二分检索*/else low=mid+1;/*继续在后半部分进行二分检索*/return-1;/*当lowhigh时表示查找区间为空,检索失败*/,线性表,/*-二分查找的递归实现-*/int binsearch2(seqlist l,datatype key,int low,int high)int mid,k;if(lowhigh)return-1;/*检索不成功的出口条件*/else mid=(low+high)/2;/*二分*/if(l.datamid=key)return mid;/*检索成功返回*/if(key l.datamid)
10、return else return,binsearch2(l,key,low,mid-1);,binsearch2(l,key,mid+1,high);,/递归地在前半部分检索,/递归地在后半部分检索,线性表,搜索成功的情形 搜索不成功的情形,从有序表构造出的二叉搜索树(判定树),若设 n=2h-1,则描述对分搜索的二叉搜索树是高度为 h-1 的满二叉树。2h=n+1,h=log2(n+1)。第0层结点有1个,搜索第0层结点要比较1次;第1层结点有2个,搜索第1层结点要比较2次;,,一、查找过程可用二叉树描述:每个记录用一个结点表示;结点中值为该记录在表中位置,这个描述查找过程的二叉树称为判
11、定树。n个元素的表的折半查找的判定树是唯一的,即:判定树由表中元素个数决定。二、查找某关键字的比较次数:为该结点在判定树上的层次数。(1)找到有序表中任一记录的过程就是:走了一条从根结点到与该记录相应的结点的路径。查找成功时比较的关键字个数最多不超过树的深度 d:d=log2 n+1(2)查找不成功的过程就是走了一条从根结点到外部结点的路径。,线性表,ASLbins=,在假定每个结点的查找概率相同的情况下,二分检索的ASL为:,用数学归纳法容易证明:,ASLbins=,=,线性表,课堂练习9-1(任选一题),1.已知一个有序表(15,26,34,39,45,56,58,63,74,76,83,
12、94)顺序存储于一维数组a12中:(1)画出二叉搜索树(判定树);(2)根据折半搜索过程填写成功搜索下表中所给元素34,56,58,63,94时的比较次数;(3)在等概率情况下,求查找成功时的平均查找长度。2.对有序表-1,0,1,3,4,6,8,10,12 进行折半查找:(1)画出二叉搜索树(判定树);(2)求查找12需要比较的次数;(3)求等概率情况下搜索成功的平均搜索长度。3.假设在有序线性表a20上进行折半查找。(1)画出二叉搜索树(判定树);(2)求平均查找长度。,树表,9.3 二叉排序树(BST),二叉排序树(二叉查找树、二叉搜索树)它或者是一棵空的二叉树,或者是具有下列性质的二叉
13、树:(1)左子树的所有结点均小于根的值;(2)右子树的所有结点均大于根的值;(3)它的左右子树也分别为二叉排序树。,下列2种图形,是不是二叉排序树?,讨论:对左图中序遍历后的结果是什么?,树表,1 2 3 4 5 6 7 8 9 10,/*/*二叉排序树用的头文件*/*文件名:bstree.h*/*/#include#include typedef int datatype;typedef struct node/*二叉排序树结点定义*/datatype key;/*结点值*/struct node*lchild,*rchild;/*左、右孩子指针*/bsnode;typedef bsnode
14、*bstree;,二叉排序树存储结构定义,树表,1.二叉排序树的查找,在二叉排序树中查找给定值k的过程是:,若root是空树,则查找失败;若k rootdata,则查找成功;否则 若k rootdata,则在root的左子树上查找;否则在root的右子树上查找。上述过程一直持续到k被找到或者待查找的子树为空,如果待查找的子树为空,则查找失败。二叉排序树的查找效率就在于只需要查找二个子树之一。,树表,50,50,50,30,40,35,50,50,80,90,在二叉排序树中查找关键字值等于50,35,90,95,树表,/*/*基于二叉排序树的检索算法 文件名:t_search.c*/*函数名:b
15、ssearch1()、bssearch2()*/*/*-二叉排序树的非递归查找-*/void bssearch1(bstree t,datatype x,bstree*p,bstree*q)/*q返回待查结点x在二叉排序树中的地址,p返回待查结点x的父结点地址*/*p=NULL;*q=t;while(*q),树表,if(x=(*q)-key)return;*p=*q;*q=(xkey)?(*q)-lchild:(*q)-rchild;return;,/*-二叉排序树的递归查找-*/bstree bssearch2(bstree t,datatype x)/*在二叉排序树t中查找关键字为x的结点
16、,若找到则返回该结点的地址,否则返回NULL*/if(t=NULL|x=t-key)return t;,树表,if(xkey)return bssearch2(t-lchild,x);/*递归地在左子树中检索*/else return bssearch2(t-rchild,x);/*递归地在右子树中检索*/,算法分析:,在二叉排序树上进行检索的方法与二分检索相似,和关键字的比较次数不会超过树的深度。因此,在二叉排序树上进行检索的效率与树的形状有密切的联系。,树表,在最坏的情况下,含有n个结点的二叉排序树退化成一棵深度为n的单支树(类似于单链表),它的平均查找长度与单链表上的顺序检索相同,即AS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 检索 查找 技术 教学 讲座 PPT

链接地址:https://www.31ppt.com/p-2661999.html