数据结构 C语言版第9章 查找课件.ppt
《数据结构 C语言版第9章 查找课件.ppt》由会员分享,可在线阅读,更多相关《数据结构 C语言版第9章 查找课件.ppt(107页珍藏版)》请在三一办公上搜索。
1、,DATA,10,65,865,数据结构,第9章 查找,学习提要,第9章 查找,本章中介绍下列主要内容:静态查找表及查找算法:顺序查找、折半查找 动态查找表及查找算法:二叉排序树 哈希表及查找算法,学习提要(具体来讲),.熟练掌握顺序表和有序表的查找方法。.熟练掌握二叉排序树的构造和查找方法。.掌握二叉平衡树的维护平衡方法。.理解树的特点以及它们的建树过程。.熟练掌握哈希表的构造方法,深刻理解哈希表与其它结构的表的实质性的差别。.掌握描述查找过程的判定树的构造方法,以及按定义计算各种查找方法在等概率情况下查找成功时的平均查找长度。,基本概念,查找表 用于查找的数据元素集合称为查找表。查找表由同
2、一类型的数据元素(或记录)构成。静态查找表 若只对查找表进行如下两种操作:(1)在查找表中查看某个特定的数据元素是否在查找表中,(2)检索某个特定元素的各种属性,则称这类查找表为静态查找表。静态查找表在查找过程中查找表本身不发生变化。对静态查找表进行的查找操作称为静态查找。,动态查找表:若在查找过程中可以将查找表中不存在的数据元素插入,或者从查找表中删除某个数据元素,则称这类查找表为动态查找表。动态查找表在查找过程中查找表可能会发生变化。对动态查找表进行的查找操作称为动态查找。关键字:是数据元素中的某个数据项。唯一能标识数据元素(或记录)的关键字,即每个元素的关键字值互不相同,我们称这种关键字
3、为主关键字;若查找表中某些元素的关键字值相同,称这种关键字为次关键字。例如,银行帐户中的帐号是主关键字,而姓名是次关键字。,查找:在数据元素集合中查找满足某种条件的数据元素的过程称为查找。最简单且最常用的查找条件是“关键字值等于某个给定值”,在查找表搜索关键字等于给定值的数据元素(或记录)。若表中存在这样的记录,则称查找成功,此时的查找结果应给出找到记录的全部信息或指示找到记录的存储位置;若表中不存在关键字等于给定值的记录,则称查找不成功,此时查找的结果可以给出一个空记录或空指针。若按主关键字查找,查找结果是唯一的;若按次关键字查找,结果可能是多个记录,即结果可能不唯一。,查找表的存储结构:查
4、找表是一种非常灵活的数据结构,对于不同的存储结构,其查找方法不同。为了提高查找速度,有时会采用一些特殊的存储结构。本章将介绍以线性结构、树型结构及哈希表结构为存储结构的各种查找算法。查找算法的时间效率:查找过程的主要操作是关键字的比较,所以通常以“平均比较次数”来衡量查找算法的时间效率。,9.1.1.顺序查找(线性查找)静态查找是指在静态查找表上进行的查找操作,在查找表中查找满足条件的数据元素的存储位置或各种属性。本节将讨论以线性结构表示的静态查找表及相应的查找算法。,9.1 静态查找表,顺序查找的基本思想:顺序查找是一种最简单的查找方法。其基本思想是将查找表作为一个线性表,可以是顺序表,也可
5、以是链表,依次用查找条件中给定的值与查找表中数据元素的关键字值进行比较,若某个记录的关键字值与给定值相等,则查找成功,返回该记录的存储位置,反之,若直到最后一个记录,其关键字值与给定值均不相等,则查找失败,返回查找失败标志。,可以采用从前向后查,也可采用从后向前查的方法。在平均情况下,大约要与表中一半以上元素进行比较效率较低。平均查找长度较大。在下面两种情况下只能采取顺序查找:a.线性表为无序表(元素排列是无序的);b.即使是有序线性表,但采用的是链式存储结构。,查找过程:对给定的一关键字K,从线性表的一端开始,逐个进行记录的关键字和K的比较,直到找到关键字等于K的记录或到达表的另一端。,(1
6、)顺序查找(线性表在顺序存储结构下的顺序查找)数据结构:#define MAX_NUM 100/用于定义表的长度typedef struct int key;float info;SSTableMAX_NUM,SSItem;,每个结点包含两部分内容:Key 和info,其他信息,假设在查找表中,数据元素个数为n(nMAX_NUM),并分别存放在数组的下标变量ST1STn中。下面我们给出顺序查找的完整算法。,int seq_search(SSTable ST,int key)/在顺序表中查找关键字值等于key的记录,/若查找成功,返回该记录的位置下标序号,否则返回0 i=1;while(i=n,
7、改进的顺序查找的算法:int Search_seq(SSTable ST,int n,int key)int i=n;ST0.key=key;while(STi.key!=key)i-;/*从表尾往前查*/return i;,监视哨,使用了监视哨,在查找过程中,不用每一步都去判断是否查找结束。找到:返回元素在线性表中的存储位置;未找到:返回0。,根据上述算法可知:查找成功时的平均查找次数为:ASL=(1+2+3+4+n)/n=(n+1)/2查找不成功时的比较次数为:n+1则顺序查找的平均查找长度为:ASL=(n+1)/2+n+1)/2=(n+1)3/4顺序查找的优点:算法简单,无需排序,采用顺
8、序和链式存储均可。缺点:平均查找长度较大。尤其当n较大时,不宜采用这种查找方法。,(2)线性表在链式存储结构下的顺序查找 链表的顺序查找是指将查找表作为线性表并以链式存储结构存储,用顺序查找方法查找与指定关键字值相等的记录。链表的类型定义如下所示:typedef struct node keytype key;/结点的关键字类型 anytype otheritem;/结点的其他成分 struct node*next;/指向链表结点的指针 Link_Node,*Link;,将查找表中的数据元素用这种结构的结点表示,并以指向头结点的指针标识。对链表实现顺寻查找就是在有头结点的链式查找表中查找关键字
9、值等于给定值的记录,若查找成功,返回指向相应结点的指针,否则返回空指针。,Link_Node*link_search(Link h,keytype k)/link为带头结点链表的头指针,查找关键字值等于k的记录,/查找成功,返回指向找到的结点的指针,查找失败返回空指针 p=h-next;while(p!=NULL),9.1.2 折半查找(二分法查找)折半查找要求查找表用顺序存储结构存放且各数据元素按关键字有序(升序或隆序)排列,也就是说折半查找只适用于对有序顺序表进行查找。,1.折半查找的基本思想是:首先以整个查找表作为查找范围,用查找条件中给定值k与中间位置结点的关键字比较,若相等,则查找成
10、功,否则,根据比较结果缩小查找范围,如果k的值小于关键字的值,根据查找表的有序性可知查找的数据元素只有可能在表的前半部分,即在左半部分子表中,所以继续对左子表进行折半查找;若k的值大于中间结点的关键字值,则可以判定查找的数据元素只有可能在表的后半部分,即在右半部分子表中,所以应该继续对右子表进行折半查找。每进行一次折半查找,要么查找成功,结束查找,要么将查找范围缩小一半,如此重复,直到查找成功或查找范围缩小为空即查找失败为止。,思想:先确定待查找记录所在的范围,然后逐步缩小范围,直到找到或确认找不到该记录为止。前提:必须在具有顺序存储结构的有序表中进行。,分三种情况:1)若中间项的值等于x,则
11、说明已查到。2)若x小于中间项的值,则在线性表的前半部分查找;3)若x大于中间项的值,则在线性表的后半部分查找。特点:比顺序查找方法效率高。最坏的情况下,需要比较 log2n次。,查找23和79的过程如下图:,mid=(low+high)/2不进位取整,(08,14,23,37,46,55,68,79,91),(08,14,23,37,46,55,68,79,91),(08,14,23,37,46,55,68,79,91),(08,14,23,37,46,55,68,79,91),(08,14,23,37,46,55,68,79,91),(08,14,23,37,46,55,68,79,91)
12、,(08,14,23,37,46,55,68,79,91),2.折半查找算法 假设查找表存放在数组ST的ST1 STn中,且升序,查找关键字值为key。折半查找的主要步骤为:(1)置初始查找范围:low=1,high=n;(2)求查找范围中间项:mid=(low+high)/2(3)将指定的关键字值key与中间项STmid.key比较 若相等,查找成功,找到的数据元素为此时mid 指向的位置;若小于,查找范围的低端数据元素指针low不变,高端数据元素指针high更新为mid-1;,若大于,查找范围的高端数据元素指针high不变,低端数据元素指针low更新为mid+1;(4)重复步骤(2)、(3
13、)直到查找成功或查找范围空(lowhigh),即查找失败为止。(5)如果查找成功,返回找到元素的存放位置,即当前的中间项位置指针mid;否则返回查找失败标志。,折半查找的c语言算法程序:int Search_Bin(SSTable ST,int n,int key)int low,high,mid;low=1;high=n;while(low=high)mid=(low+high)/2;if(STmid.key=key)return(mid);/*查找成功*/else if(key STmid.key)high=mid-1;/*在前半区间继续查找*/else low=mid+1;/*在后半区间
14、继续查找*/return(0);/*查找不成功*/,是顺序查找的一种改进方法,就是把被查找的表分成若干块,每块中记录的存放顺序是无序的,但块与块之间必须按关键字有序。即第一块中任一记录的关键字都小于第二块中任一记录的关键字,而第二块中任一记录的关键字都小于第三块中任一记录的关键字,依此类推。该法要为被查找的表建立一个索引表,索引表中的一项对应于表中的一块,索引表中含有这一块中的最大关键字和指向块内第一个记录位置的指针,索引表中各项关键字有序。,9.1.3 分块查找(索引顺序查找),索引表,块中的最大关键字,块内第一个记录位置的指针,分块查找步骤:,查索引表,确定要找的记录在哪一块。在相应的块中
15、查找。,例如,要找关键字为22的记录。由索引的第一项可知,要找的记录要么在第二块中,要么不存在。并获取第二块中第一个记录的位置。,9.2.1 二叉排序树和平衡二叉树9.2.1.1 二叉排序树 1.二叉排序树(二叉查找树)的概念,9.2 动态查找表,二叉排序树是一种常用的动态查找表,下面首先给出它的非递归形式。二叉排序树是一棵二叉树,它或者为空,或者具有如下性质:(1)任一非终端结点若有左孩子,则该结点的关键字值大于其左孩子结点的关键字值。(2)任一非终端结点若有右孩子,则该结点的关键字值小于其右孩子结点的关键字值。,二叉排序树也可以用递归的形式定义,即二叉排序树是一棵树,它或者为空,或者具有如
16、下性质:(1)若它的左子树非空,则其左子树所有结点的关键字值均小于其根结点的关键字值。(2)若它的右子树非空,则其右子树所有结点的关键字值均大于其根结点的关键字值。(3)它的左右子树都是二叉排序树。例如,由关键字值序列 10、18、3、8、12、2、7、3 构成的一棵二叉排序树如下图所示。,如果对上述二叉排序树进行中根遍历可以得到一个关键字有序序列 2,3,3,7,8,10,12,18,这是二叉排序树的一个重要特征,也正是由此将其称为“二叉排序树”。,2.二叉排序树的查找 二叉排序树的结构定义中可看到:一棵非空二叉排序树中根结点的关键字值大于其左子树上所有结点的关键字值,而小于其右子树上所有结
17、点的关键字值,所以在二叉排序树中查找一个关键字值为k 的结点的基本思想是:用给定值k与根结点关键字值比较,如果k小于根结点的值,则要找的结点只可能在左子树中,所以继续在左子树中查找,否则将继续在右子树中查找,依此方法,查找下去,至直查找成功或查找失败为止。,二叉排序树查找的过程描述如下:(1)若二叉树为空树,则查找失败,(2)将给定值k 与根结点的关键字值比较,若相等,则查找成功,(3)若根结点的关键字值小于给定值k,则在左子树中继续搜索,(4)否则,在右子树中继续查找。假定二叉排序树的链式存储结构的类型定义如下:,typedef struct node keytype key;anytype
18、 otheritem;struct node*lchild;struct node*rchild;Bin_Sort_Tree_Node,*Bin_Sort_Tree;二叉排序树查找过程的描述是一个递归过程,若用链式存储结构存储,其查找操作的递归算法如下所示:,Bin_Sort_Tree_Node*bt_search(Bin_Sort_Tree bt,keytype k)/在根指针为bt的二叉排序树上查找一个关键字值为k的结点,/若查找成功返回指向该结点的指针,否则返回空指针 if(bt=NULL)|(bt-key=k)return bt;else if(k key)return bt_sear
19、ch(bt-lchild,k);/在左子树中搜索 else return bt_search(bt-rchild,k);/在右子树中搜索,这个过程也可以用非递归算法实现,算法描述如下:Bin_Sort_Tree_Node*bt_search1(Bin_Sort_Tree bt,keytype k)p=bt;/指针p指向根结点,搜索从根结点开始 while(p!=NULL,3.二叉排序树的插入和删除 3-1.二叉排序树的插入 在一棵二叉排序树中插入一个结点可以用一个递归的过程实现,即:若二叉排序树为空,则新结点作为二叉排序树的根结点;否则,若给定结点的关键字值小于根结点关键字值,则插入在左子树上
20、;若给定结点的关键字值大于根结点的值,则插入在右子树上。,10、18、3、8、12、2、7、3,10,10,18,3,8,12,2,7,3,下面是二叉排序树插入操作的递归算法。void bt_insert1(Bin_Sort_Tree*bt,Bin_Sort_Tree_Node*pn)/在以bt为根的二叉排序树上插入一个由指针pn指向的新的结点 if(*bt=NULL)*bt=pn;else if(*bt-key pn-key)bt_insert 1(,这个算法也可以用非递归的形式实现,如下所示:void bt_insert 2(Bin_Sort_Tree*bt,Bin_Sort_Tree_N
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 C语言版第9章 查找课件 语言版 查找 课件
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-3051790.html