数据结构-C语言版第9章-查找课件.ppt
《数据结构-C语言版第9章-查找课件.ppt》由会员分享,可在线阅读,更多相关《数据结构-C语言版第9章-查找课件.ppt(107页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1065865ABCDEFG学习提要学习提要第第9章章 查找查找 本章中介绍下列主要内容:本章中介绍下列主要内容:静态查找表及查找算法:静态查找表及查找算法:顺序查找顺序查找、折半查找折半查找 动态查找表及查找算法:动态查找表及查找算法:二叉排序树二叉排序树 哈希表哈希表及查找算法及查找算法学习提要(具体来讲)学习提要(具体来讲).熟练掌握顺序表和有序表的查找方法。熟练掌握顺序表和有序表的查找方法。.熟练掌握二叉排序树的构造和查找方法。熟练掌握二叉排序树的构造和查找方法。.掌握二叉平衡树的维护平衡方法。掌握二叉平衡树的维护平衡方法。.理解树的特点以及它们的建树过程。理解树的特点以及它们的建树过
2、程。.熟熟练练掌掌握握哈哈希希表表的的构构造造方方法法,深深刻刻理理解解哈哈希表与其它结构的表的实质性的差别。希表与其它结构的表的实质性的差别。.掌掌握握描描述述查查找找过过程程的的判判定定树树的的构构造造方方法法,以以及及按按定定义义计计算算各各种种查查找找方方法法在在等等概概率率情情况况下下查找成功时的平均查找长度。查找成功时的平均查找长度。基本概念基本概念 查查找找表表 用用于于查查找找的的数数据据元元素素集集合合称称为为查查找找表表。查查找找表表由由同同一一类类型型的的数数据据元元素素(或或记记录录)构成。构成。静静态态查查找找表表 若若只只对对查查找找表表进进行行如如下下两两种种操操
3、作作:(1)在在查查找找表表中中查查看看某某个个特特定定的的数数据据元元素素是是否否在在查查找找表表中中,(2)检检索索某某个个特特定定元元素素的的各各种种属属性性,则则称称这这类类查查找找表表为为静静态态查查找找表表。静静态态查查找找表表在在查查找找过过程程中中查查找找表表本本身身不不发发生生变变化化。对静态查找表进行的查找操作称为对静态查找表进行的查找操作称为静态查找静态查找。动动态态查查找找表表:若若在在查查找找过过程程中中可可以以将将查查找找表表中中不不存存在在的的数数据据元元素素插插入入,或或者者从从查查找找表表中中删删除除某某个个数数据据元元素素,则则称称这这类类查查找找表表为为动
4、动态态查查找找表表。动动态态查查找找表表在在查查找找过过程程中中查查找找表表可可能能会会发发生生变变化化。对对动动态态查查找找表表进进行行的的查查找找操操作作称称为为动态查找动态查找。关关键键字字:是是数数据据元元素素中中的的某某个个数数据据项项。唯唯一一能能标标识识数数据据元元素素(或或记记录录)的的关关键键字字,即即每每个个元元素素的的关关键键字字值值互互不不相相同同,我我们们称称这这种种关关键键字字为为主主关关键键字字;若若查查找找表表中中某某些些元元素素的的关关键键字字值值相相同同,称称这这种种关关键键字字为为次次关关键键字字。例例如如,银银行行帐帐户户中中的的帐帐号号是是主主关关键键
5、字字,而而姓姓名名是是次次关关键键字。字。查查找找:在在数数据据元元素素集集合合中中查查找找满满足足某某种种条条件件的的数数据据元元素素的的过过程程称称为为查查找找。最最简简单单且且最最常常用用的的查查找找条条件件是是“关关键键字字值值等等于于某某个个给给定定值值”,在在查查找找表表搜搜索索关关键键字字等等于于给给定定值值的的数数据据元元素素(或或记记录录)。若若表表中中存存在在这这样样的的记记录录,则则称称查查找找成成功功,此此时时的的查查找找结结果果应应给给出出找找到到记记录录的的全全部部信信息息或或指指示示找找到到记记录录的的存存储储位位置置;若若表表中中不不存存在在关关键键字字等等于于
6、给给定定值值的的记记录录,则则称称查查找找不不成成功功,此此时时查查找找的的结结果果可可以以给给出出一一个个空空记记录录或或空空指指针针。若若按按主主关关键键字字查查找找,查查找找结结果果是是唯唯一一的的;若若按按次次关关键键字字查查找找,结结果果可可能能是是多多个个记记录录,即即结果可能不唯一。结果可能不唯一。查查找找表表的的存存储储结结构构:查查找找表表是是一一种种非非常常灵灵活活的的数数据据结结构构,对对于于不不同同的的存存储储结结构构,其其查查找找方方法法不不同同。为为了了提提高高查查找找速速度度,有有时时会会采采用用一一些些特特殊殊的的存存储储结结构构。本本章章将将介介绍绍以以线线性
7、性结结构构、树树型型结构结构及及哈希表结构哈希表结构为存储结构的各种查找算法。为存储结构的各种查找算法。查查找找算算法法的的时时间间效效率率:查查找找过过程程的的主主要要操操作作是是关关键键字字的的比比较较,所所以以通通常常以以“平平均均比比较较次次数数”来衡量查找算法的时间效率。来衡量查找算法的时间效率。9.1.1.顺序查找(线性查找)顺序查找(线性查找)静静态态查查找找是是指指在在静静态态查查找找表表上上进进行行的的查查找找操操作作,在在查查找找表表中中查查找找满满足足条条件件的的数数据据元元素素的的存存储储位位置置或或各各种种属属性性。本本节节将将讨讨论论以以线线性性结结构构表示的静态查
8、找表及相应的查找算法。表示的静态查找表及相应的查找算法。9.1 静态查找表静态查找表顺序查找的基本思想顺序查找的基本思想:顺顺序序查查找找是是一一种种最最简简单单的的查查找找方方法法。其其基基本本思思想想是是将将查查找找表表作作为为一一个个线线性性表表,可可以以是是顺顺序序表表,也也可可以以是是链链表表,依依次次用用查查找找条条件件中中给给定定的的值值与与查查找找表表中中数数据据元元素素的的关关键键字字值值进进行行比比较较,若若某某个个记记录录的的关关键键字字值值与与给给定定值值相相等等,则则查查找找成成功功,返返回回该该记记录录的的存存储储位位置置,反反之之,若若直直到到最最后后一一个个记记
9、录录,其其关关键键字字值值与与给给定定值值均均不不相相等等,则查找失败,返回查找失败标志。则查找失败,返回查找失败标志。可以采用从前向后查,也可采用从后向前查的方法。可以采用从前向后查,也可采用从后向前查的方法。在在平平均均情情况况下下,大大约约要要与与表表中中一一半半以以上上元元素素进进行行比比较效率较低。平均查找长度较大。较效率较低。平均查找长度较大。在下面两种情况下只能采取顺序查找:在下面两种情况下只能采取顺序查找:a.线性表为无序表(元素排列是无序的);线性表为无序表(元素排列是无序的);b.即使是有序线性表,但采用的是链式存储结构。即使是有序线性表,但采用的是链式存储结构。查找过程:
10、查找过程:对对给给定定的的一一关关键键字字K,从从线线性性表表的的一一端端开开始始,逐逐个个进进行行记记录录的的关关键键字字和和K的的比比较较,直直到到找找到到关关键键字字等等于于K的的记记录或到达表的另一端。录或到达表的另一端。(1)顺序查找)顺序查找(线性表在顺序存储结构下的顺序查找)线性表在顺序存储结构下的顺序查找)数据结构:数据结构:#define MAX_NUM 100 /用于定义表的长度用于定义表的长度typedef struct int key;float info;SSTableMAX_NUM,SSItem;每个结点包含两部分每个结点包含两部分内容:内容:Key 和和info其
11、他其他信息信息 假假 设设 在在 查查 找找 表表 中中,数数 据据 元元 素素 个个 数数 为为n(nMAX_NUM),并并分分别别存存放放在在数数组组的的下下标变量标变量ST1STn中。中。下面我们给出顺序查找的完整算法。下面我们给出顺序查找的完整算法。int seq_search(SSTable ST,int key)/在顺序表中查找关键字值等于在顺序表中查找关键字值等于key的记录,的记录,/若若查查找找成成功功,返返回回该该记记录录的的位位置置下下标标序序号号,否则返回否则返回0 i=1;while(i=n&STi.key!=key)i+;if(inext;while(p!=NULL
12、)&(p-key!=k)p=p-next;return p;9.1.2 折半查找(二分法查找)折半查找(二分法查找)折折半半查查找找要要求求查查找找表表用用顺顺序序存存储储结结构构存存放放且且各各数数据据元元素素按按关关键键字字有有序序(升升序序或或隆隆序序)排排列列,也也就就是是说说折折半半查查找找只只适适用用于于对对有有序序顺顺序序表表进进行行查找。查找。1.折半查找的基本思想是折半查找的基本思想是:首首先先以以整整个个查查找找表表作作为为查查找找范范围围,用用查查找找条条件件中中给给定定值值k与与中中间间位位置置结结点点的的关关键键字字比比较较,若若相相等等,则则查查找找成成功功,否否则
13、则,根根据据比比较较结结果果缩缩小小查查找找范范围围,如如果果k的的值值小小于于关关键键字字的的值值,根根据据查查找找表表的的有有序序性性可可知知查查找找的的数数据据元元素素只只有有可可能能在在表表的的前前半半部部分分,即即在在左左半半部部分分子子表表中中,所所以以继继续续对对左左子子表表进进行行折折半半查查找找;若若k的的值值大大于于中中间间结结点点的的关关键键字字值值,则则可可以以判判定定查查找找的的数数据据元元素素只只有有可可能能在在表表的的后后半半部部分分,即即在在右右半半部部分分子子表表中中,所所以以应应该该继继续续对对右右子子表表进进行行折折半半查查找找。每每进进行行一一次次折折半
14、半查查找找,要要么么查查找找成成功功,结结束束查查找找,要要么么将将查查找找范范围围缩缩小小一一半半,如如此此重重复复,直直到到查查找找成成功功或或查查找找范范围围缩缩小小为为空空即查找失败为止。即查找失败为止。思思想想:先先确确定定待待查查找找记记录录所所在在的的范范围围,然然后后逐逐步步缩缩小小范范围围,直直到到找找到到或或确确认认找找不不到到该该记记录录为止。为止。前前提提:必必须须在在具具有有顺顺序序存存储储结结构构的的有有序序表表中中进行进行。分三种情况:分三种情况:1 1)若中间项的值等于)若中间项的值等于x,x,则说明已查到。则说明已查到。2 2)若)若x x小于中间项的值,则在
15、线性表的前半部分查找;小于中间项的值,则在线性表的前半部分查找;3 3)若)若x x大于中间项的值,则在线性表的后半部分查找。大于中间项的值,则在线性表的后半部分查找。特特点点:比比顺顺序序查查找找方方法法效效率率高高。最最坏坏的的情情况况下下,需需要要比比较较 loglog2 2n n次次。查找查找23和和79的过程如下图:的过程如下图:mid=(low+high)/2不进位取整不进位取整(08,14,23,37,46,55,68,79,91)(08,14,23,37,46,55,68,79,91)lowhighmid(08,14,23,37,46,55,68,79,91)lowhigh=m
16、id-1mid(08,14,23,37,46,55,68,79,91)low=mid+1highmid(08,14,23,37,46,55,68,79,91)lowhighmid(08,14,23,37,46,55,68,79,91)lowhighmid(08,14,23,37,46,55,68,79,91)lowhighmid2.折半查找算法折半查找算法 假假设设查查找找表表存存放放在在数数组组ST的的ST1 STn中中,且升序,查找关键字值为且升序,查找关键字值为key。折半查找的主要步骤为:折半查找的主要步骤为:(1)置初始查找范围:)置初始查找范围:low=1,high=n;(2)求查
17、找范围中间项:)求查找范围中间项:mid=(low+high)/2 (3)将将 指指 定定 的的 关关 键键 字字 值值 key与与 中中 间间 项项STmid.key比较比较 若若相相等等,查查找找成成功功,找找到到的的数数据据元元素素为为此此时时mid 指向的位置;指向的位置;若若小小于于,查查找找范范围围的的低低端端数数据据元元素素指指针针low不变,高端数据元素指针不变,高端数据元素指针high更新为更新为mid-1;若若大大于于,查查找找范范围围的的高高端端数数据据元元素素指指针针high不变,低端数据元素指针不变,低端数据元素指针low更新为更新为mid+1;(4)重重复复步步骤骤
18、(2)、(3)直直到到查查找找成成功功或或查找范围空(查找范围空(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(mi
19、d);/*查找成功查找成功*/else if(key key=k)return bt;else if(k key)return bt_search(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指向根结点,搜索从根结点开始指向根结点,搜索从根结点开始 whi
20、le(p!=NULL&p-key!=k)if(k key)p=p-lchild;else p=p-rchild;return(p);3.二叉排序树的插入和删除二叉排序树的插入和删除 3-1.二叉排序树的插入二叉排序树的插入 在在一一棵棵二二叉叉排排序序树树中中插插入入一一个个结结点点可可以以用用一一个个递递归归的的过过程程实实现现,即即:若若二二叉叉排排序序树树为为空空,则则新新结结点点作作为为二二叉叉排排序序树树的的根根结结点点;否否则则,若若给给定定结结点点的的关关键键字字值值小小于于根根结结点点关关键键字字值值,则则插插入入在在左左子子树树上上;若若给给定定结结点点的的关关键键字字值值大
21、大于于根结点的值,则插入在右子树上。根结点的值,则插入在右子树上。10、18、3、8、12、2、7、3 1010181018310183810183812101838122101838122731018381227下面是二叉排序树插入操作的递归算法。下面是二叉排序树插入操作的递归算法。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_i
22、nsert 1(&(*bt-lchild),pn);else if(*bt-key key)bt_insert1(&(*bt-rchild),pn);这个算法也可以用非递归的形式实现,如下所示:这个算法也可以用非递归的形式实现,如下所示:void bt_insert 2(Bin_Sort_Tree*bt,Bin_Sort_Tree_Node*pn)p=bt;while(p!=NULL&p-key!=pn-key)q=p;if(p-key pn-key)p=p-lchild;else p=p-rchild;if(p=NULL)if(q-key pn-key)q-lchild=pn;else q-
23、rchild=pn-key;利用二叉排序树的插入算法,可以很容易利用二叉排序树的插入算法,可以很容易地实现创建二叉排序树的操作,其基本思想为:地实现创建二叉排序树的操作,其基本思想为:由一棵空二叉树开始,经过一系列的查找插入由一棵空二叉树开始,经过一系列的查找插入操作生成一棵二叉排序树。操作生成一棵二叉排序树。例如,由结点关键字序列例如,由结点关键字序列 10、18、3、8、12、2、7、3 构造二叉排序树的过程为:从构造二叉排序树的过程为:从空二叉树开始,依次将每个结点插入到二叉排空二叉树开始,依次将每个结点插入到二叉排序树中插入,在插入每个结点时都是从根结点序树中插入,在插入每个结点时都是
24、从根结点开始搜索插入位置,找到插入位置后,将新结开始搜索插入位置,找到插入位置后,将新结点作为叶子结点插入,经过点作为叶子结点插入,经过8次的查找和插入操次的查找和插入操作,建成由这作,建成由这8个结点组成的二叉排序树。个结点组成的二叉排序树。创建二叉排序树的算法如下:创建二叉排序树的算法如下:Bin_Sort_Tree_Node*bt_bulid(Bin_Sort_Tree a,int n)/在数组在数组a的的a1an单元中存放着将要构成二叉排序树的单元中存放着将要构成二叉排序树的n个结点内容个结点内容bt=NULL;for(i=1;i key=ai.key;p-otheritem=ai.o
25、theritem;p-lchile=NULL;p-rchile=NULL;bt_insert1(&bt,p);return(bt);3-2.二叉排序树的删除二叉排序树的删除 下面分四种情况讨论一下如何确保从二叉树下面分四种情况讨论一下如何确保从二叉树中删除一个结点后,不会影响二叉排序树的性中删除一个结点后,不会影响二叉排序树的性质:质:(1)若要删除的结点为叶子结点,可以直接)若要删除的结点为叶子结点,可以直接进行删除。进行删除。(2)若要删除结点有右子树,但无左子树,)若要删除结点有右子树,但无左子树,可用其右子树的根结点取代要删除结点的位置。可用其右子树的根结点取代要删除结点的位置。(3)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 查找 课件
限制150内