数据结构第四讲.ppt
《数据结构第四讲.ppt》由会员分享,可在线阅读,更多相关《数据结构第四讲.ppt(88页珍藏版)》请在三一办公上搜索。
1、1,第四讲 查找和排序,2,本章出题特点,在历年统考里,大多以客观题的形式出现,具体如下:,3,一、查找,查找的基本概念顺序查找折半查找B树查找散列表,4,基本概念,在查找表上进行的基本操作有:查询,检索,插入和删除。若只是前两种操作的查找表则称为静态查找表,若兼有后面两种,则称为动态查找表。查找的基本操作是关键字间的比较,查找每一个元素所需比较次数的平均值称为平均查找长度,即,通常用平均查找长度来衡量查找算法的好坏。,5,例如,在关键字序列为3,9,1,5,8,10,6,7,2,4的线性表查找关键字为6的元素。顺序查找过程如下:,顺序查找,6,开始:3 9 1 5 8 10 6 7 2 4
2、第1次比较:3 9 1 5 8 10 6 7 2 4 i=0 第2次比较:3 9 1 5 8 10 6 7 2 4 i=1 第3次比较:3 9 1 5 8 10 6 7 2 4 i=2 第4次比较:3 9 1 5 8 10 6 7 2 4 i=3 第5次比较:3 9 1 5 8 10 6 7 2 4 i=4 第6次比较:3 9 1 5 8 10 6 7 2 4 i=5 第7次比较:3 9 1 5 8 10 6 7 2 4 i=6 查找成功,返回序号6,7,从顺序查找过程可以看到(不考虑越界比较in),ci取决于所查记录在表中的位置。如查找表中第1个记录R0时,仅需比较一次;而查找表中最后一个记
3、录Rn-1时,需比较n次,即ci=i。因此,成功时的顺序查找的平均查找长度为:,查找成功时的平均比较次数约为表长的一半。,思考题:不成功时的平均查找长度是多少?,8,二分查找 二分查找也称为折半查找,要求线性表中的结点必须己按关键字值的递增或递减顺序排列。思路:首先用要查找的关键字k与中间位置的结点的关键字相比较,这个中间结点把线性表分成了两个子表,若比较结果相等则查找完成;若不相等,再根据k与该中间结点关键字的比较大小确定下一步查找哪个子表,这样递归进行下去,直到找到满足条件的结点或者该线性表中没有这样的结点。,9,例如,在关键字有序序列2,4,7,9,10,14,18,26,32,40中采
4、用二分查找法查找关键字为7的元素。二分查找过程如下:,10,开始:2 4 7 9 10 14 18 26 32 40 low=0 high=9 mid=(0+9)/2=4 第1次比较:2 4 7 9 10 14 18 26 32 40 low=0 high=3 mid=(0+3)/2=1 第2次比较:2 4 7 9 10 14 18 26 32 40 low=2 high=3 mid=(2+3)/2=2第3次比较:2 4 7 9 10 14 18 26 32 40 R2.key=7 查找成功,返回序号2,11,二分查找过程可用二叉树来描述:把当前查找区间的中间位置上的记录作为根;左子表和右子表
5、中的记录分别作为根的左子树和右子树。称为描述二分查找的判定树或比较树。,12,R0.10的二分查线的判定树(n=11),13,因此,在等概率假设下,二分查找成功时的平均查找长度为:,二分查找的适用场合:1、元素间必须有序;2、存储结构应当是顺序存储,而不宜适用链式结构。,14,索引查找(分块查找),15,例如,设有一个线性表,其中包含25个记录,其关键字序列为:8,14,6,9,10,22,34,18,19,31,40,38,54,66,46,71,78,68,80,85,100,4,88,96,87假设将25个记录分为5块,每块中有5个记录,该线性表的索引存储结构如下图所示。,16,若以二分
6、查找来确定块,则分块查找成功时的平均查找长度为:,若以顺序查找确定块,则分块查找成功时的平均查找长度为:,当s=时,ASL blk取极小值+1,即当采用顺序查找确定块时,应将各块中的记录数选定为。,17,B-树 B-树又称为多路平衡查找树,是一种组织和维护外存文件系统非常有效的数据结构。B-树中所有结点的孩子结点最大值称为B-树的阶,通常用m表示,从查找效率考虑,要求m3。一棵m阶B-树或者是一棵空树,或者是满足下列要求的m叉树:(1)树中每个结点至多有m个孩子结点(即至多有m-1个关键字);(2)除根结点外,其他结点至少有m/2个孩子结点(即至少有m/2-1=(m-1)/2个关键字);(3)
7、若根结点不是叶子结点,则根结点至少有两个孩子结点;,18,(4)每个结点的结构为:,其中,n为该结点中的关键字个数,除根结点外,其他所有结点的n大于等于m/2-1,且小于等于m-1;ki(1in)为该结点的关键字且满足kiki+1;pi(0in)为该结点的孩子结点指针且满足pi(0in-1)结点上的关键字大于等于ki且小于ki+1,pn结点上的关键字大于kn。(5)所有叶子结点都在同一层上,即B-树是所有结点的平衡因子均等于0的多路查找树。,19,一棵5阶B-树,20,B-树的查找 在B-树中查找给定关键字的方法类似于二叉排序树上的查找,不同的是在每个记录上确定向下查找的路径不一定是二路(即二
8、叉)的,而是n+1路的。因为记录内的关键字序列是有序的数量key1.n,故既可以用顺序查找,也可以用折半查找。在一棵B-树上顺序查找关键字为k的方法为:,21,将k与根结点中的keyi进行比较:(1)若k=keyi,则查找成功;(2)若kkey1,则沿着指针ptr0所指的子树继续查找;(3)若keyikkeyi+1,则沿着指针ptri所指的子树继续查找;(4)若kkeyn,则沿着指针ptrn所指的子树继续查找。,22,2.B-树的插入将关键字k插入到B-树的过程分两步完成:(1)利用前述的B-树的查找算法找出该关键字的插入结点(注意B-树的插入结点一定是叶子结点)。(2)判断该结点是否还有空位
9、置,即判断该结点是否满足nm-1,若该结点满足nm-1,说明该结点还有空位置,直接把关键字k插入到该结点的合适位置上(即满足插入后结点上的关键字仍保持有序);,23,若该结点有n=m-1,说明该结点已没有空位置,需要把结点分裂成两个。分裂的做法是,取一新结点,把原结点上的关键字和k按升序排序后,从中间位置(即m/2=(m+1)/2之处)把关键字(不包括中间位置的关键字)分成两部分,左部分所含关键字放在旧结点中,右部分所含关键字放在新结点中,中间位置的关键字连同新结点的存储位置插入到父亲结点中。如果父结点的关键字个数也超过Max,则要再分裂,再往上插,直至这个过程传到根结点为止。,24,例如 关
10、键字序列为:1,2,6,7,11,4,8,13,10,5,17,9,16,20,3,12,14,18,19,15。创建一棵5阶B-树。建立B-的过程如下图所示。,25,1 2 6 7,插入11,6,1 2,6,7 11,插入4,1 2 4,插入8,13,7 8 11 13,插入10,7 8 11 13,11 13,7 8,6 10,插入5,1 2 4 5,插入17,11 13 17,6 10 16,7 8 9,插入9,插入16,11 13 16 17,11 13,17 20,插入3,3 6 10 16,1 2,4 5,插入12,14,18,19,11 12 13 14,17 18 19 20,
11、插入15,14 15,11 12,13,13 16,3 6,10,插入20,16,3,10,1,2,6,7,11,4,8,13,10,5,17,9,16,20,3,12,14,18,19,15,26,27,3.B-树的删除 B-树的删除过程与插入过程类似,只是稍为复杂一些。要使删除后的结点中的关键字个数m/2-1,将涉及到结点的“合并”问题。在B-树上删除关键字k的过程分两步完成:(1)利用前述的B-树的查找算法找出该关键字所在的结点。(2)在结点上删除关键字k分两种情况:一种是在叶子结点上删除关键字;另一种是在非叶子结点上删除关键字。,28,(3)在非叶子结点上删除关键字的过程:假设要删除关
12、键字keyi(1in),在删去该关键字后,以该结点ptri所指子树中的最小关键字keymin来代替被删关键字keyi所在的位置(注意ptri所指子树中的最小关键字keymin一定是在叶子结点上)。然后再以指针ptri所指结点为根结点查找并删除keymin(即再以ptri所指结点为B-树的根结点,以keymin为要删除的关键字,然后再次调用B-树上的删除算法)。这样也就把在非叶子结点上删除关键字k的问题转化成了在叶子结点上删除关键字keymin的问题。,29,(4)在B-树的叶子结点上删除关键字共有以下三种情况:假如被删结点的关键字个数大于Min,说明删去该关键字后该结点仍满足B-树的定义,则可
13、直接删去该关键字。假如被删结点的关键字个数等于Min,说明删去关键字后该结点将不满足B-树的定义。此时若该结点的左(或右)兄弟结点中关键字个数大于Min,则把该结点的左(或右)兄弟结点中最大(或最小)的关键字上移到双亲结点中,同时把双亲结点中大于(或小于)上移关键字的关键字下移到要删除关键字的结点中,这样删去关键字k后该结点以及它的左(或右)兄弟结点都仍旧满足B-树的定义。,30,假如被删结点的关键字个数等于Min,并且该结点的左和右兄弟结点(如果存在的话)中关键字个数均等于Min。这时,需把要删除关键字的结点与其左(或右)兄弟结点以及双亲结点中分割二者的关键字合并成一个结点。如果因此使双亲结
14、点中关键字个数小于Min,则对此双亲结点做同样处理,以致于可能直到对根结点做这样的处理而使整个树减少一层。,31,10,14 15,13 16,3 6,1 2,7 8 9,17 18 19 20,4 5,11 12,7 9,删8,删16,17,13,13 17,18 19 20,删15,14,17,18,14 17,19 20,删4,5,1 2 3 5,6,6 10 13 18,13 18,对于前例生成的B-树,给出删除8,16,15,4等四个关键字的过程。,32,例如,对于上例生成的B-树,给出删除8,16,15,4等四个关键字的过程。,33,9.3.4 B+树 在索引文件组织中,经常使用B
15、-树的一些变形,其中B+树是一种应用广泛的变形。一棵m阶B+树满足下列条件:(1)每个分支结点至多有m棵子树。(2)除根结点外,其他每个分支结点至少有(m+1)/2棵子树。(3)根结点至少有两棵子树,至多有m棵子树。(4)有n棵子树的结点有n个关键字。,34,(5)所有叶子结点包含全部(数据文件中记录)关键字及指向相应记录的指针(或存放数据文件分块后每块的最大关键字及指向该块的指针),而且叶子结点按关键字大小顺序链接(可以把每个叶子结点看成是一个基本索引块,它的指针不再指向另一级索引块,而是直接指向数据文件中的记录)。(6)所有分支结点(可看成是索引的索引)中仅包含它的各个子结点(即下级索引的
16、索引块)中最大关键字及指向子结点的指针。,35,一棵4阶的B+树,36,m阶的B+树和m阶的B-树,定义中的前三点是相同的,主要的差异是:(1)在B+树中,具有n个关键字的结点含有n棵子树,即每个关键字对应一棵子树,而在B-树中,具有n个关键字的结点含有(n+1)棵子树。(2)在B+树中,每个结点(除根结点外)中的关键字个数n的取值范围是m/2n m,根结点n的取值范围是1nm;而在B-树中,它们的取值范围分别是m/2-1n m-1和1nm-1。(3)B+树中的所有叶子结点包含了全部关键字,即其他非叶子结点中的关键字包含在叶子结点中,而在B-树中,叶子结点包含的关键字与其他结点包含的关键字是不
17、重复的。,37,(4)B+树中所有非叶子结点仅起到索引的作用,即结点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有该关键字对应记录的存储地址。而在B-树中,每个关键字对应一个记录的存储地址。(5)通常在B+树上有两个头指针,一个指向根结点,另一个指向关键字最小的叶子结点,所有叶子结点链接成一个不定长的线性链表。,38,哈希表查找哈希表的基本概念 哈希表(Hash Table)又称散列表,是除顺序表存储结构、链接表存储结构和索引表存储结构之外的又一种存储线性表的存储结构。哈希表存储的基本思路是:设要存储的对象个数为n,设置一个长度为m(mn)的连续内存单元,以线性表中每个对象
18、的关键字ki(0in-1)为自变量,通过一个称为哈希函数的函数h(ki),把ki映射为内存单元的地址(或称下标)h(ki),并把该对象存储在这个内存单元中。h(ki)也称为哈希地址(又称散列地址)。把如此构造的线性表存储结构称为哈希表。,39,但是存在这样的问题,对于两个关键字ki和kj(ij),有kikj(ij),但h(ki)=h(kj)。把这种现象叫做哈希冲突。通常把这种具有不同关键字而具有相同哈希地址的对象称做“同义词”,由同义词引起的冲突称作同义词冲突。在哈希表存储结构的存储中,同义词冲突是很难避免的,除非关键字的变化区间小于等于哈希地址的变化区间,而这种情况当关键字取值不连续时是非常
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第四
链接地址:https://www.31ppt.com/p-5357822.html