数据结构查找.ppt
《数据结构查找.ppt》由会员分享,可在线阅读,更多相关《数据结构查找.ppt(54页珍藏版)》请在课桌文档上搜索。
1、2023年3月2日,1,8.1 基本概念与术语 8.2 静态查找表 8.3 动态查找表 8.4 哈希表查找 8.5 小结与习题,第八章 查找,本章主要内容,本章主要学习静态查找和动态查找方法。静态查找包括顺序查找、二分查找和分块索引查找等,动态查找包括二叉排序树、B树等。作为重点内容本章还介绍了哈希查找及相关知识。查找是数据结构中的重要操作,好的查找方法会大大提高执行效率。通过本章学习,应掌握以下内容:查找的有关概念;静态查找;动态查找;哈希查找。,2023年3月2日,2,2023年3月2日,3,8.1 基本概念与术语,查找就是指在给定的一组数据中对某个数值进行查询的过程。关键字是数据元素(或
2、记录)中某个项或组合项的数值,它可以标识一个数据元素或记录。主关键字将能唯一确定一个数据元素(或记录)的关键字。查找表是由具有相同类型的数据元素(或记录)组成的集合。分为静态查找表和动态查找表两大类。,如果查找表中能够找到满足条件的记录,称为查找成功,否则称为查找不成功。,2023年3月2日,4,静态查找表:在对查找表进行操作时,不改变表的结构,只进行查找操作;动态查找表:在对查找表进行操作时,可以改变该查找表的结构,既可以进行查找操作,又可以进行插入、删除等操作。,8.2 静态查找表,8.2.1 静态查找表结构 静态查找表是由数据元素组成的线性表。其存储结构分为顺序存储和链式存储两种。可以用
3、顺序表或线性链表来表示静态查找表。,2023年3月2日,5,8.2.1 静态查找表结构,typedef int KeyType;typedef struct KeyType key;ElemType;typedef struct ElemType elemMAXSIZE+1;int length;SST;,typedef struct NODE ElemType data;/*结点的数据域*/struct NODE*next;/*指针域*/NodeType;,静态查找表的顺序存储结构定义,静态查找表的链式存储结构定义,2023年3月2日,6,8.2.2 顺序查找 顺序查找又称线性查找,它思路简
4、单、容易实现,是一种最基本的查找方法。其查找过程为:从查找表的一端开始,逐个进行关键字与查找值的比较,若某个记录的关键字值与给定值相等,则查找成功,给出数据元素在查找表中的位置;若将整个表查找完,仍未找到与给定值相同的关键字,则查找失败,给出提示信息。,2023年3月2日,7,【算法8.1】顺序查找int Search_Seq(SST ST,KeyType x)ST.elem0.key=x;/*设置监护哨*/i=ST.length;while(ST.elemi.key!=x)i-;/*返回找到记录的下标或者0(查找不成功)*/return i;/*Search_Seq*/,将查找过程中给定值和
5、关键字比较的次数称为查找长度。通常用平均查找长度ASL来衡量查找算法的优劣。,算法分析:,2023年3月2日,8,平均查找长度:在查找成功时,平均查找长度ASL是指为确定数据元素在表中位置所进行关键字比较次数的期望值。对一个含n个数据元素的表,查找成功时,Pi为表中第i个数据元素的查找概率,Ci为表中第i个数据元素的关键字与给定值x相等时,需要比较的次数。,设查找表长度为n,查找元素x和表中第i个元素关键字相等时,需要比较的次数为n-i+1,则平均查找长度为:,2023年3月2日,9,设查找表中各元素的查找概率相等,即 Pi=1/n,则上面的式子表示为:,当查找成功时,顺序查找的时间复杂度就是
6、O(n)。当查找失败时,关键字与给定值的比较次数总是n+1次。,8.2.3二分查找 二分查找,也称为折半查找,是对有序表进行的一种高效率的线性查找。有序表是指数据元素按给定的关键字已经是升序(或者是降序)的查找表。,2023年3月2日,10,假设各记录的关键字是由小到大排序的,算法的实现过程为:在待查找的有序表中,将中间元素首先与给定值进行比较,若相等,则表示查找成功;若给定值小于中间元素的关键字,则在左边的区域中继续查找;若给定值大于中间元素的关键字,则在右边的区域中继续查找。重复上述过程,直到查找成功或者查找失败,查找的过程随之结束。,例在给定的序列A=6,13,17,20,24,28,3
7、0,36,39,44,48,51,55中查找给定值13和52这两个数据。查找关键字为13的过程,2023年3月2日,11,第一次 low=1 mid=7 high=13因x30,下一步继续在左半区查找,即:,0 1 2 3 4 5 6 7 8 9 10 11 12 13,第二次 low=1 mid=3 high=6因x17,下一步继续在左半区查找,即:,0 1 2 3 4 5 6 7 8 9 10 11 12 13,2023年3月2日,12,因x6,下一步继续在右半区查找。此时,low=2,high=2,mid=(2+2)/2=2。由于x=13,查找成功,所找到的记录序号为2。,查找关键字为5
8、2的过程,第一次 low=1 mid=7 high=13因x30,下一步继续在右半区查找,即:,0 1 2 3 4 5 6 7 8 9 10 11 12 13,第二次 low=8 mid=10 high=13 因x44,下一步继续在右半区查找,即:,0 1 2 3 4 5 6 7 8 9 10 11 12 13,2023年3月2日,13,第三次 low=11 high=13 mid=12因x51,下一步继续在右半区查找,即:,0 1 2 3 4 5 6 7 8 9 10 11 12 13,第四次 low=mid=high=13因xhigh,所以查找失败。,0 1 2 3 4 5 6 7 8 9
9、 10 11 12 13,2023年3月2日,14,【算法8.2】二分查找int Search_Bin(SST ST,KeyType x)low=1;high=ST.length;while(lowST.elemmid.key)low=mid+1;/*查找区间缩小到右边区域*/else return mid;return ERROR;,2023年3月2日,15,算法分析:对于有序查找表,可采用建立二叉树的方法:将表的中间元素作为二叉树的根结点,比中间值小的所有结点全部在二叉树的左子树中,比中间值大的所有结点全部在二叉树的右子树中。按照这种思路建立的二叉树称为判定二叉树。如图所示。,2023年3
10、月2日,16,时间复杂度:该算法的时间复杂度取决于该二叉树中从根结点到该查找元素所在的结点的路径上与中间结点的比较次数,即该元素结点在树中的所在的层数。对于n个结点的判定树,树高为h,则有2h-1-1n2h-1,即h-1log2(n+1)h,所以h=int(log2(n+1)(int为取整函数)。,二分查找的平均查找长度(ASL)为:,=120+221+h2h-1=(n+1)n*log2(n+1)-1log2(n+1)-1,所以,二分查找的时间复杂度为O(log2n)。,2023年3月2日,17,8.2.4 分块查找二分查找适用于顺序存储的有序表查找,但并不是所有的查找表都是有序的。,分块查找
11、又称索引顺序查找,其思想是先将查找表中的数据分成若干个块,并为这若干个块建立相应的索引表,查找时通过将表分块操作而提高效率。,索引表的值包括两个部分:关键字和指针,其中关键字部分存放的是某子表中的最大关键字值,指针部分存放的是对应子表的起始位置,索引表中的表项必须以关键字字段有序排列。查找过程:首先查找索引表,确定关键字记录所在的块,然后在块中顺序查找。,2023年3月2日,18,【例8-2】设关键字集合为:96,40,12,33,81,4,58,45,39,64,18,85,17,57按关键字值33,58,96分为三个块建立的查找表及其索引表。,说明:在分块查找算法中,索引表中关键字的选取将
12、对算法的优劣度起到相当大的作用,若能够使各子表中纪录个数基本项等,则可以提高算法效率。,2023年3月2日,19,8.3 动态查找表,动态查找表将在查找的过程中对记录的关键字进行了插入或删除等修改操作。,8.3.1二叉排序树 二叉排序树属动态查找方法。可根据相应的二叉排序树,实现对结点的查找。,1二叉排序树定义二叉排序树又称为二叉查找树,其定义是一个递归过程:它或者是一棵空树;或者是具有下列性质定义的二叉树:,2023年3月2日,20,若左子树不空,则左子树上所有结点的值均小于根结点的值;若右子树不空,则右子树上所有结点的值均大于或等于根结点的值。左右子树都分别是一棵二叉排序树。,8.3.2二
13、叉排序树的建立1.二叉排序树的建立:由空集为初始状态,将结点按关键字依次插入到排序二叉树中去。先将第一个结点作为二叉树的根结点,插入其它结点时,若结点的值小于根结点的值,则插入左子树,否则插入右子树,该过程依次进行,直到整个过程结束。,2023年3月2日,21,2.二叉排序树的操作二叉排序树的主要操作包括插入、查找、删除等。(1)插入结点二叉排序树插入结点的过程和二叉树的建立过程中各结点的插入相似,即将一个元素插入到二叉排序树中。,(2)查找结点根据前面的定义可知,二叉排序树的查找是一个递归的过程,具体如下:若二叉排序树为空,则查找失败,输出相关信息。若二叉查找树不为空,将给定值x与查找树的根
14、结点关键字进行比较。,2023年3月2日,22,否则,完成下面的判断:(i)若给定的值x小于根结点关键字的值,查找将按照递归的方式在左子树上进行。(ii)若给定的值x大于根结点关键字的值,查找将按照递归的方式在右子树上进行。(iii)重复以上过程,直到查找结束(成功或者失败)。,若比较结果为相等,则查找成功,整个查找结束。,2023年3月2日,23,(3)删除结点:当删除一个结点之后,原二叉树的结构可能发生变化,需要将其进行相应的调整。使其保持二叉排序树的性质。设准备删除的结点为p,其双亲结点为f,以下分三种情况进行讨论。,(1)若结点p为叶子结点,删去叶子结点后不影响整棵树的特性,所以,只需
15、将被删除结点的双亲结点相应指针域改为空指针。,2023年3月2日,24,(2)若结点p为非叶子结点,假设只有右子树pr或只有左子树pl,此时,只需将pr或pl替换f结点的p结点即可。如图8-5所示。,2023年3月2日,25,(3)若结点p既有左子树pl又有右子树pr,可按中序遍历保持有序的原则进行调整。,调整方法有:直接令pl为*r相应的子树,以pr为pl中序遍历的最后一个结点pk的右子树;令p结点的直接前驱pr或直接后继(对pl子树中序遍历的最后一个结点pk)替换p结点,再按的方法删去pr或pk。对给定序列建立二叉排序树时,若左右子树分布均匀,则能提高查找效率。因此,对均匀的二叉排序树进行
16、插入或删除结点后,应对其进行调整,使其依然保持均匀。,2023年3月2日,26,(a),(3)若结点p既有左子树pl又有右子树pr,如图(a)所示,可按照中序遍历保持有序的原则进行调整。调整方法有以下两种:1)直接使左子树pl为f的左子树,再使pr为子树pl中序遍历最后一个结点的右子树,如图(b)所示。2),2023年3月2日,27,将p结点的直接前驱(或直接后继)替换结点p,然后再从二叉排序树中删除它的直接前驱(或直接后继),如图(c)所示。,2023年3月2日,28,【例8-3】记录的关键字序列为:60,94,74,57,69,41,99,85,13,48,59,则构造一棵二叉排序树的过程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 查找
链接地址:https://www.desk33.com/p-229783.html