数据结构课程讲义.ppt
《数据结构课程讲义.ppt》由会员分享,可在线阅读,更多相关《数据结构课程讲义.ppt(98页珍藏版)》请在三一办公上搜索。
1、第九章 查找,这也是线性表的基本运算之一。通常称为检索、查询等。1 线性查找 11 顺序检索 基本思想:从线性表的一端开始,逐个地将待查找元素的关键字与每个元素的关键字进行比较,若找到,则返回1,否则返回0。该算法的时间复杂度为O(n).,1 线性查找,顺序查找采用从头至尾逐个比较 最快O(1)最慢O(n)查找成功的等概率平均时间复杂性 O(n+1)/2)1/n(1+2+3+n)=(n+1)/2 查找失败O(n+1)查找的等概率平均时间复杂性 O(3(n+1)/4)查找成功失败各半 1/2n(1+2+n)+n(n+1)=3(n+1)/4,1 线性查找,1 线性查找,12 二分查找 亦称折半查找
2、,是基于提高查找速度的一种方法。检索时要求元素是排序的。基本思想:每次将待查找元素的关键字与已排序元素序列的中间点元素进行比较,如相等,则返回1,否则修改高点或低点,重新进行查找比较。该算法的时间复杂度为O(n).,这是有序表的查找查找,对已排序的查找结构先确定中点,比较待查关键字与中点关键字的大小,反复直到成功。求n个数据折半查找的等概率成功查找的平均时间复杂性 1 2 3 4 5 6 7 8 9 10,1,2,2,3,3,3,3,4,4,4,1+2*2+4*3+3*4=29 O(29/10),n个元素的折半查找,2k-1n2k+1-1查找成功平均概率时间复杂性 介于 log2(2k)-1
3、和 log2(2k+1)-1 之间即 k-1 和 k 之间 k=log2(n+1)n个元素的折半查找成功平均概率时间复杂性 log2(n+1)-1/2,1 线性查找,13 分块查找 亦称索引顺序查找。也是基于提高查找速度的一种方法。检索时要求元素构成的块间是排序的,而块内是未排好序的。基本思想:将所有元素按关键字值划分成若干块,块之间是排序的,而块内暂时是无序的。查找时候,首先折半查找确定元素所在的块,然后再在块内进行顺序查找即可比较。,3、索引顺序查找,分块有序 后一子表中的关键字都大于前一子表中的关键字,最大关键字 起始地址,索引表,索引顺序表的查找,查找 关键字key=38 1.先检索索
4、引表 确定子表位置 2.再在子表中查找,索引表,分块查找成功的平均概率时间复杂性,索引表查找时间+子表查找时间设索引表长为s,查找表长为n,被平均分成s块,每块长n/s,索引表平均查找时间(s+1)/2 子表平均查找时间(n/s+1)/2(s+1)+(n/s+1)=(s+n/s)+1当 s=n 时 有最小值 n+1,当索引顺序表已经排序时,子块查找可以用折半查找。平均查找时间:(s+1)/2+log2(1+n/s)-1/2=log2(1+n/s)+s/2索引也用折半查找,平均查找时间 log2(s+1)-1/2+log2(1+n/s)-1/2=log2(s+1)(1+n/s)-1当s=n 时
5、2 log2(n+1)-1,2 树形结构的查找,21 二叉排序树及其查找过程 二叉树BT是二叉排序树,只要BT是满足如下的条件:(1)若BT的左子树非空,则其左子树上所有结点的值均小于其根结点的值;(2)若其右子树上所有结点的值均大于其根结点的值;(3)其左右子树均为二叉排序树。对二叉排序树的中序遍历的结果就是一个升序序列。二叉排序树又称为二叉查找树。于是,只要将元素序列组织成二叉排序树,在进行查找时,让待查找元素与根结点值进行比较,若相等,则查找成功,否则,如果比根结点小,则只需要在左子树中查找即可;如果比根结点大,则只需要在右子树中查找即可。,2 树形结构的查找,其所涉及到的数据结构如下:
6、typedef struct btnode keytype key;datatype other;struct btnode*lchild,*rchild;BSTNODE;BSTNODE*ptr;则*ptr就表示一棵二叉排序树。,2 树形结构的查找,22 二叉排序树实现查找运算 根据二叉排序树的定义和性质,不难得到其查找算法:int bstsearch(*Pt,x)pkey=x)return(1);if(p-keyx)prchild;else plchild;,二叉查找树的查找分析,平均等概率查找时间(1+2+2+3+3+3)/6=14/6,45,12,57,8,20,60,45,12,8,2
7、0,3,11,(1+2+3+4+5+6)/6=7/2,随机二叉查找树等概率平均查找时间,P(n)2(1+1/n)lnn O(log2n)最坏 O(n/2),特点:用于频繁进行插入、删除、查找的所谓动态查找表。,122,250,300,110,200,99,二叉排序树,L,N,P,E,M,C,Y,105,230,216,查找步骤:若根结点的关键字值等于查找的关键字,成功。否则,若小于根结点的关键字值,查其左子树。若大于根结点的关键字值,查其右子树。在左右子树上的操作类似。,122,250,300,110,200,99,105,230,216,2 树形结构的查找,2.2 二叉排序树的插入运算 由于
8、插入运算是二叉树的基本运算之一,所以利用二叉树的插入运算就可以实现在线性升序序列中插入结点,使之仍然是升序的功能。其实现过程为:若二叉排序树为空,则待插入结点*s就作为根结点插入到空二叉树中;若二叉树非空,则比较s-key:p-key,若,就插入到右子树中,若=则不必插入。该过程是递归的,很容易得到递归算法,也可以得到非递归算法。,2 树形结构的查找,void insertbst(*pt,*s)pkeykey)plchild;else prchild;if(pt=NULL)ptkeykey)f-lchildrchild=s;显然,插入运算是将待插入结点作为叶子插入的。所以算法的目的就是首先找到
9、插入的位置。,2、插入算法:首先执行查找算法,找出被插结点的父亲结点。判断被插结点是其父亲结点的左、右儿子。将被 插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。,e、g:将数的序列:122、99、250、110、300、280 作为二叉排序树的结 点的关键字值,生成二叉排序树。,122,2、插入算法:首先执行查找算法,找出被插结点的父亲结点。判断被插结点是其父亲结点的左、右儿子。将被 插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。,e、g:将数的序列:122、99、250、110、300、280 作为二
10、叉排序树的结 点的关键字值,生成二叉排序树。,122,122,99,2、插入算法:首先执行查找算法,找出被插结点的父亲结点。判断被插结点是其父亲结点的左、右儿子。将被 插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。,e、g:将数的序列:122、99、250、110、300、280 作为二叉排序树的结 点的关键字值,生成二叉排序树。,122,122,99,122,250,99,2、插入算法:首先执行查找算法,找出被插结点的父亲结点。判断被插结点是其父亲结点的左、右儿子。将被 插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结
11、点总是叶子结点。,e、g:将数的序列:122、99、250、110、300、280 作为二叉排序树的结 点的关键字值,生成二叉排序树。,122,122,99,122,250,99,122,250,110,99,2、插入算法:首先执行查找算法,找出被插结点的父亲结点。判断被插结点是其父亲结点的左、右儿子。将被 插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。,e、g:将数的序列:122、99、250、110、300、280 作为二叉排序树的结 点的关键字值,生成二叉排序树。,122,122,99,122,250,99,122,250,110,99,12
12、2,250,300,110,99,2、插入算法:首先执行查找算法,找出被插结点的父亲结点。判断被插结点是其父亲结点的左、右儿子。将被 插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。,122,250,300,110,280,99,e、g:将数的序列:122、99、250、110、300、280 作为二叉排序树的结 点的关键字值,生成二叉排序树。,122,122,99,122,250,99,122,250,110,99,122,250,300,110,99,2、插入算法:,执行实例:插入值为 280 的结点,15,60,70,30,20,50,3、二叉
13、排序树的查找分析,平均情况分析(在成功查找两种的情况下),e.g:下述两种情况下的成功的平均查找长度 ASL,15,60,70,30,20,50,ASL=(1+2+2+3+3+3)/6=14/6,ASL=(1+2+3+4+5+6)/6=21/6,2 树形结构的查找,2.3 二叉排序树的删除运算 由于删除结点运算也是二叉树的基本运算之一,所以利用二叉树的删除运算就可以实现在线性升序序列中删除结点,使之仍然是升序的序列。其实现过程为:若待删除结点不在二叉排序树,则不进行任何操作;否则,假设找到的待删除结点为*p,fath指向*p的双亲,那么,删除*p的过程可以采用如下的方法:*p是否有左(右)子树
14、来分别进行处理。,2 树形结构的查找,(1)若*p没有左子树,则只需要将*p的右子树按照二叉排序树的特性,连接到合适的位置即可。若*p没有根结点,则只需要将*p的右子树的根作为新的根结点;若*p不是根,则必须将它与其双亲*fath之间的连接断开,可以采用将将连接到*p的右子树连接到*fath的左(右)链域上。当然,若*p的右子树也为空,则*p就是叶子结点,即p-rchild=NULL,则就相当于将空树连接到*fath的左(右)链域中。,2 树形结构的查找,(2)若*p有左子树,则*p也可能有右子树,需要将*p的左、右子树按照二叉排序树的特性,连接到合适的位置。此时可以采用两种处理方法:一种是令
15、p的左子树直接连接到*p的双亲*fath的左(右)链域上,而*p的右子树下接到*p的中序前趋结点*s的右链域上。(这里*s是*p的左子树中最右下的结点,其右链域肯定为空)。另外一种处理方法是:采用以*p的中序前趋*s顶替*p(相当于将*s的内容复制到*p中),将*s的左子树直接上接到*s的双亲*q左(右)链域上,再删去*s。,叶子结点:直接删除,更改它的父亲结点的相应指针域为空。如:删除关键字为 15、70 的结点。,15,60,70,30,20,50,60,30,20,50,子树的根结点:通常的做法:选取“替身”取代被删结点。有资格充当该替身的是谁哪?左子树中最大的结点 或 右子树中最小的结
16、点,参看图。要点:维持二叉排序树的特性不变。在中序周游中紧靠着被删结点的结点才有资格作为“替身”。,122,250,300,110,200,99,105,230,216,400,450,500,子树的根结点:若被删结点的左儿子为空或者右儿子为空。如下图所示,删除结点的关键字为 99、200 的结点。,被删结点,122,250,300,200,230,216,400,450,500,110,105,删除,99,122,250,300,110,200,99,105,230,216,400,450,500,被删结点,子树的根结点:若被删结点的左儿子为空或者右儿子为空。如下图所示,删除结点的关键字为
17、99、200 的结点。,122,250,300,230,216,400,450,500,删除,200,110,99,105,122,250,300,110,200,99,105,230,216,400,450,500,被删结点,子树的根结点:若被删结点的左儿子为空或者右儿子为空。如下图所示,删除结点的关键字为 99、200 的结点。,结论:将被删结点的另一儿子作为它的父 亲结点的儿子,究竟是作为左儿子 还是右儿子依原替身结点和其父亲 结点的关系而定。释放被删结点的空间。,被删结点,子树的根结点:若被删结点的左、右子树皆不空,通常的做法:选取“替身”取代被删结点。有资格充当该替身的是谁哪?左子树
18、中最大的结点(被删结点的左子树中的最右的结点,其右儿子指针域为空)或 右子树中最小的 结点(被删结点的右子树中的最左的结点,其左儿子指针域为空),参看下图。要点:维持二叉排序树的特性不变。在中序周游中紧靠着被删 结点的结点才有资格作为“替身”。,做法:将替身的关键字复制到被删结 点的关键字。将结点 的左儿子作为 的父结点 的右儿子。,110,110,99,注意:结点 右儿子必为空 结点 的父结点为,110,110,99,200,250,300,110,99,105,230,216,400,450,500,做法:将替身的关键字复制到被删结 点的关键字。将结点 的右儿子作为 的父结点 的左儿子。,
19、注意:结点 左儿子必为空 结点 的父结点为,200,200,200,200,250,结论:先将替身的关键字复制到被删结点 将原替身的另一儿子作为它的父亲 结点的儿子,究竟是作为左儿子还 是右儿子依原替身结点和其父亲结点的关系而定。释放原替身结点的空间。,F,S,C,Q,QL,SL,F,C,Q,QL,S,SL,F,PL、PR皆 空,直接删除。,PL或PR为空,,PL为空,删除后的情况。,1.删除法,2.删除法,2 树形结构的查找,24 平衡二叉树简介 由于二叉排序树的结构形态直接影响到查找的效率,所以必须构造出平衡二叉树。只要满足平衡因子(即任何两个子树的高度之差)只能是-1,0,1的,则称为平
20、衡二叉树。通常情况下,平衡二叉树的深度是很低的,所以其查找效率是最高的。,D,G,E,D,A,B,C,F,E,G,B,A,平衡二叉排序树,起因:提高查找速度,避免最坏情况出现。如右图情况的出现。虽然完全树的树型最好,但构造困难。常使用平衡树。,C,F,平衡因子(平衡度):结点的平衡度是结点的左子树的高度右子树的高度。平衡二叉树:每个结点的平衡因子都为 1、1、0 的二叉树。或者说每个 结点的左右子树的高度最多差一的二叉树。注意:完全树必为平衡树,平衡树不一定是完全树。,平衡树的 Adelson 算法的本质特点:以插入为例:在左图所示的平衡树中插入关键字为 2 的结点。插入之后仍应保持平衡排序二
21、叉树的性质不变。,14,12,5,3,9,28,63,53,60,50,17,18,7,30,+1,+1,-1,-1,-1,0,0,0,0,0,0,0,0,平衡树,14,12,5,3,9,28,63,53,60,50,17,18,7,30,+1,+1,-1,-1,-1,0,0,0,0,0,0,0,0,2,+1,+1,+2,原平衡度为 0,危机结点,如何用最简单、最有效的办法保持平衡排序二叉树的性质不变?,平衡树的 Adelson 算法的本质特点:以插入为例:在左图所示的平衡树中插入关键字为 2 的结点。插入之后仍应保持平衡排序二叉树的性质不变。,14,12,5,3,9,28,63,53,60,
22、50,17,18,7,30,+1,+1,-1,-1,-1,0,0,0,0,0,0,0,0,2,+1,+1,+2,原平衡度为 0,危机结点,如何用最简单、最有效的办法保持平衡排序二叉树的性质不变?,解决方案:不涉及到危机结点的父亲结点,即以危机结点为根的子树的高度应保持不变(左图为 3)。新结点插入后,找到第一个平衡度不为 0 的结点(如左图结点)即可。新插入的结点和第一个平衡度不为 0 的结点(也可能是危机结点)之间的结点,其平衡度皆为 0在调整中,仅调整那些在平衡度变化的路径上的结点(如:),其它结点不予调整。仍应保持排序二叉树的性质不变。,9,3,5,9,14,12,5,3,9,28,63
23、,53,60,50,17,18,7,30,+1,+1,-1,-1,-1,0,0,0,0,0,0,0,0,2,+1,+1,+2,原平衡度为 0,危机结点,如何用最简单、最有效的办法保持平衡排序二叉树的性质不变?,2,3,5,9,7,12,2,3,5,9,7,12,不可以以结点 为子树的根结点!虽然,对本例来说是可以行得通的。,7,14,12,5,3,9,28,63,53,60,50,17,18,7,30,+1,+1,-1,-1,-1,0,0,0,0,0,0,0,0,2,+1,+1,+2,原平衡度为 0,危机结点,关键:将导致出现危机结点的情况全部分析清除,就可以使得平衡排序二叉树的性质保持不变!
24、,14,9,3,2,5,28,63,53,60,50,17,18,7,30,+1,+1,-1,-1,-1,0,0,0,0,0,0,0,12,0,0,2.5 非平衡二叉树的平衡处理方法,若一棵二叉排序树是平衡二叉树,插入某个结点后,可能会变成非平衡二叉树,这时,就可以对该二叉树进行平衡处理,使其变成一棵平衡二叉树。处理的原则应该是处理与插入点最近的、而平衡因子又比1大或比-1小的结点。我们分四种情况讨论平衡处理。,1、LL型 的处理(左左型)如下图所示,在A的左孩子B上插入一个左孩子结点C,使A的平衡因子由1变成了2,成为不平衡的二叉树序树。这时的平衡处理为:将A顺时针旋转,成为B的右子树,而原
25、来B的右子树则变成A的左子树,待插入结点C作为B的左子树。(注:图中结点旁边的数字表示该 结点的平衡因子),即左改组。,左改组(新插入结点出现在危机结点的左子树上进行的调整)的情况分析:1、LL 情况:(LL:表示新插入结点在危机结点的左子树的左子树上),A,B,+1,h-1,0,+2,+1,h,h-1,h-1,LL 改组,BL,BR,AR,B,A,0,h,0,h-1,h-1,BL,BR,AR,危机结点,改组前:高度为 h+1 中序序列:,A,B,BL,BR,AR,改组后:高度为 h+1 中序序列:,A,B,BL,BR,AR,注意:改组后 平衡度为 0,A,B,2、LR型的处理(左右型)如下图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程 讲义
链接地址:https://www.31ppt.com/p-6296893.html