静态查找表二叉排序树平衡二叉树AVL树小结B树哈希表.ppt
《静态查找表二叉排序树平衡二叉树AVL树小结B树哈希表.ppt》由会员分享,可在线阅读,更多相关《静态查找表二叉排序树平衡二叉树AVL树小结B树哈希表.ppt(104页珍藏版)》请在三一办公上搜索。
1、静态查找表二叉排序树平衡二叉树(AVL树)小结B树哈希表,第9章 查找,查找(Search)的概念,静态查找表,查找:就是在数据集合中寻找满足某种条 件的数据对象。查找表:是由同一类型的数据元素(或记录)组成的数据集合。查找的结果通常有两种可能:查找成功,即找到满足条件的数据对象。查找不成功,或查找失败。作为结果,报告一些信息,如失败标志、失败位置等。,关键字:数据元素中某个数据项的值,用以 标识一个数据元素。主关键字:可唯一地标识一个数据元素的关 键字。次关键字:用以识别若干记录的关键字。使用基于主关键字的查找,查找结果应是 唯一的。静态查找表(p214)动态查找表,9.1 静态查找表,基本
2、操作:Create(/遍历查找表,衡量一个查找算法的时间效率的标准是:在查找过程中关键字的平均比较次数或平均读写磁盘次数(只适合于外部查找),这个标准也称为平均查找长度ASL(Average Search Length),通常它是查找结构中对象总数 n 或文件结构中物理块总数 n 的函数。另外衡量一个查找算法还要考虑算法所需要的存储量和算法的复杂性等问题。在静态查找表中,数据对象存放于数组中,利用数组元素的下标作为数据对象的存放地址。查找算法根据给定值x,在数组中进行查找。直到找到x在数组中的存放位置或可确定在数组中找不到x为止。,9.1.1顺序表的查找(Sequential Search),
3、所谓顺序查找,又称线性查找,主要用于在线性结构中进 行查找。存储结构:typedef struct ElemType*elem;int length;SSTable;查找过程:从表中最后一个元素开始,顺序用各元素的关键字与给定值x进行比较,若找到与其值相等的元素,则查找成功,给出该元素在表中的位置;否则,若直到第一个记录仍未找到关键字与x相等的对象,则查找失败。,算法9.1(p217)Search_Seq(SSTable ST,KeyType key)/顺序查找的算法,0号元素为监视哨int i;ST.elem0.key=key;for(i=ST.length;!EQ(ST.elemi.key
4、,key);-i);return i;,顺序查找的平均查找长度,设查找第 i 个元素的概率为 pi,查找到第 i 个元素所需比较次数为 ci,则查找成功的平均查找长度:,在顺序查找情形,ci=n-i+1,i=1,n,因此,在等概率情形,pi=1/n,i=0,1,n-1。,9.1.2 有序表的查找,折半查找:先求位于查找区间正中的对象的下标mid,用其关键字与给定值x比较:Elementmid.getKey()=x,查找成功;Elementmid.getKey()x,把查找区间缩小到表的前半部分,再继续进行对分查找;Elementmid.getKey()x,把查找区间缩小到表的后半部分,再继续进
5、行对分查找。每比较一次,查找区间缩小一半。如果查找区间已缩小到一个对象,仍未找到想要查找的对象,则查找失败。,9.1.2 有序表的查找,折半查找:(1)mid=(low+high)/2(2)比较 ST.elemmid.key=key?如果 ST.elemmid.key=key,则查找成功,返回mid值 如果 ST.elemmid.key key,则置high=mid-1 如果 ST.elemmid.key high时,表明查找不成功,查找结束。,查找成功的例子 查找失败的例子,算法9.2(p220)int Search_Bin(SSTable ST,KeyType key)/折半查找 int
6、low,high,mid;low=1;high=ST.length;while(low high)mid=(low+high)/2;if(EQ(key,ST.elemmid.key)return mid;else if(LT(key,ST.elemmid.key)high=mid-1;else low=mid+1;return 0;,查找成功的情形 查找不成功的情形,从有序表构造出的二叉查找树(判定树),若设 n=2h-1,则描述对分查找的二叉查找树是高度为 h 的满二叉树。2h=n+1,h=log2(n+1)。第1层结点有1个,查找第1层结点要比较1次;第2层结点有2个,查找第2层结点要比较
7、2次;,,1)分块有序(升序或降序)第I块中的最大(小)值小(大)于第i+1块中的最(大)小值2)查找(1)先查索引表折半查找(2)再查顺序表顺序查找 块间有序,块内无序 typedef struct int key;Eletype;typedef struct Elemtype*elem;int length;SSTable;#define BLOCK_NUM 3,9.1.2 索引顺序表的查找分块查找,Typedef struct int Maxkey;int next;BLKNode,ITBLOCK_Num;int Search_Bin(SSTable ST,int key)/折半查找 i
8、nt i,p,low,high,mid;printf(“Create index table,Input Maxkey,i=ITlow.next;ST.ele0.key=key;If(low!=BLOCK_NUM)p=ITlow+1.next;else p=ST.length+1;while(ST.elemi%p.key!=key)i+;return(i%p);性能分析:ASL(bls)=Lb+Lw=(b+1/)2+(s+1)/2=(b+s+2)/2=(n/s+s)/2+1b 分块的个数 b=n/2s 每块中的记录个数n 记录的总个数Lb 确定所在的块Lw 块内查找,可以用归纳法证明,这样,第
9、 i(1 i h)层结点有 2i-1个,查找第 i 层结点要比较 i次,。假定每个结点的查找概率相等,即pi=1/n,则查找成功的平均查找长度为,9.2 动态查找表,表结构本身是在查找过程中动态生成的。基本操作:InitDSTable(/遍历查找表,定义 二叉排序树(二叉查找树)或者是一棵空树,或者是具有下列性质的二叉树:每个结点都有一个作为查找依据的关键字(key),所有结点的关键字互不相同。左子树(若非空)上所有结点的关键字都小于根结点的关键字。右子树(若非空)上所有结点的关键字都大于根结点的关键字。左子树和右子树也是二叉排序树。,9.2.1二叉排序树(Binary Sort Tree),
10、如果对一棵二叉排序树进行中序遍历,可以按从小到大的顺序,将各结点关键字排列起来。,几个二叉排序树的例子,二叉排序树上的构建如何构造二叉排序树,1)构造过程:从空树出发,依次插入R1 Rn各数据值:(1)如果二叉排序树是空树,则插入结点就是 二叉排序树的根结点;(2)如果二叉排序树是非空的,则插入值与 跟结点比较,若小于根结点的值,就插 入到左子树中去;否则插入到右子树中。示例:45,24,53,12,22,90,2)二叉排序树的数据类型描述,typedef struct int key;ElemType;typedef struct BiTNode ElemType data;struct B
11、iTNode*lchild,*rchild;BiTNode,*BiTree;,3)二叉排序树上插入结点的算法,(1)在二叉排序树上插入一个结点的算法;(2)依次输入一组数据元素,并插入到二叉排 序树中的算法,(1)将指针S所指的结点插入到根结点指针为T的 二叉排序树中的算法,void Insert_BST(BiTree,(2)输入一组数据元素的序列,构造二叉排序树 的算法,void Creat BST(BiTree,4)二叉排序树上的查找(动态查找),int Searh_BST(BiTree T,int key)BiTree p,q,S,p=T;while(p)if(p-data.key=ke
12、y)return(1);else if(p-data.key key)q=p;p=p-lchild;else q=p;p=p-rchild;S=(BiTNode*)malloc(sizeof(BitNode);S-data.key=key;S-lchild=S-rchild=NULL;if(!T)T=S;else if(q-data.key key)q-lchild=S;else q-rchild=S;return(0);说明:(1)正常情况下,返回0是未找到,但实际上已经插入;(2)也可以用return返回一个自己定义的标志值。,要求:删除一个结点后,仍然保持二叉排序树 的有序性 删除结点的
13、算法:(1)确定被删除结点:A.有没有被删除的结点;B.若有,则确定被删除的结点是根结点还 是一般结点(2)如果被删除结点是根结点,则调用删除根结点的 算法;(3)如果被删除结点是一般结点,则调用删除一般结 点的算法。,5)二叉排序树的删除,删除二叉排序树的根结点的算法(1)根结点有左右子树的情况下,选择根结点的 左子树中的最大结点为新的根结点;/或者是 右子树中的最小结点为新的根结点;*最大结点中序遍历(2)如果根结点没有左子树,则以右子树的根 结点作为新的根结点;(3)如果根结点没有右子树,则以左子树的根 结点作为新的根结点,删除二叉排序树中一般结点的算法(1)若被删除结点P有左、右子树,
14、则按照中序遍历找其 左子树中的最大结点,以此最大结点的值代替P结点 的值,然后删除此最大结点(如同删除根结点)(2)若被删除结点P没有左子树,则把结点P的右子树的 全部挂接在P的双亲上,且位置是P在其双亲中原来 的位置(3)若被删除结点P没有右子树,则把结点P的左子 树的全部挂接在P的双亲上,且位置是P在其双 亲中原来的位置删除二叉排序树中叶子结点的算法 只需将其双亲结点指向它的指针清零,再释放它即可,int Delete_BST(BiTree return(0),删除二叉排序树中结点的算法寻找被删除的结点,void delNode(BiTree,删除二叉排序树中结点的算法 删除找到的结点,二
15、叉排序树上的查找,在二叉排序树上进行查找,是一个从根结点开始,沿某一个分支逐层向下进行比较判等的过程。它可以是一个递归的过程。假设想要在二叉排序树中查找关键字为x的元素,查找过程从根结点开始。如果根指针为NULL,则查找不成功;否则用给定值x与根结点的关键字进行比较:如果给定值等于根结点的关键字,则查找成功。如果给定值小于根结点的关键字,则继续递归查找根结点的左子树;否则。递归查找根结点的右子树。,int SearchBST(BiTree T,KeyType key,BiTree f,BiTree,二叉排序树的查找 插入新结点88,每次结点的插入,都要从根结点出发查找插入位置,然后把新结点作为
16、叶结点插入。,二叉排序树的插入,为了向二叉排序树中插入一个新元素,必须先检查这个元素是否在树中已经存在。在插入之前,先使用查找算法在树中检查要插入元素有还是没有。查找成功:树中已有这个元素,不再插入。查找不成功:树中原来没有关键字等于给定值的结点,把新元素加到查找操作停止的地方。,int InsertBST(BiTree,输入数据,建立二叉排序树的过程,输入数据序列 53,78,65,17,87,09,81,45,23,同样 3 个数据 1,2,3,输入顺序不同,建立起来的二叉排序树的形态也不同。这直接影响到二叉排序树的查找性能。如果输入序列选得不好,会建立起一棵单支树,使得二叉排序树的高度达
17、到最大,这样必然会降低查找性能。2,1,3 1,2,3 1,3,2 2,3,1 3,1,2 3,2,1,1,2,3,1,1,1,1,3,2,2,2,3,3,2,3,二叉排序树的删除,在二叉排序树中删除一个结点时,必须将因删除结点而断开的二叉链表重新链接起来,同时确保二叉排序树的性质不会失去。为保证在执行删除后,树的查找性能不至于降低,还需要防止重新链接后树的高度增加。删除叶结点,只需将其双亲结点指向它的指针清零,再释放它即可。被删结点缺右子树,可以拿它的左子女结点顶替它的位置,再释放它。被删结点缺左子树,可以拿它的右子女结点顶替它的位置,再释放它。,被删结点左、右子树都存在,可以在它的右子树中
18、寻找中序下的第一个结点(关键字最小),用它的值填补到被删结点中,再来处理这个结点的删除问题。或:在它的左子树中寻找中序下的最后一个结点,用它的值替换被删结点,再处理该结点的删除。(书上算法9.8即为第二种办法),二叉排序树的删除递归算法(算法9.7)int DeleteBST(BiTree,int Delete(BiTree,最优二叉查找树,对于有 n 个关键字的集合,其关键字有 n!种不同的排列,可构成的不同二叉查找树有(棵)如何评价这些二叉查找树,可以用树的查找效率来衡量。例如,已知关键字集合 a1,a2,a3=do,if,to,对应查找概率为 p1=0.5,p2=0.1,p3=0.05,
19、在各个查找不成功的间隔内查找概率又分别为 q0=0.15,q1=0.1,q2=0.05,q3=0.05。可能的二叉查找树如下所示。,(b),(d),(a),(c),(e),在扩充二叉查找树中 表示内部结点,包含了关键字集合中的某一个关键字;表示外部结点,代表造成查找失败的各关键字间隔中的不在关键字集合中的关键字。在每两个外部结点之间必然存在一个内部结点。,设二叉树的内部结点有 n 个,外部结点有 n+1 个。如果定义每个结点的路径长度为该结点的层次,并用 I 表示所有 n 个内部结点的路径长度之和,用 E 表示 n+1 个外部结点的路径长度之和,可以用归纳法证明,E=I+2n。一棵扩充二叉查找
20、树的查找成功的平均查找长度ASLsucc可以定义为该树所有内部结点上的权值pi与查找该结点时所需的关键字比较次数ci(=li+1)乘积之和:,扩充二叉查找树查找不成功的平均查找长度ASLunsucc为树中所有外部结点上权值qj与到达外部结点所需关键字比较次数cj(=lj)乘积之和:,扩充二叉查找树总的平均查找长度为:ASL=ASLsucc+ASLunsucc 所有内、外部结点上的权值关系为,(1)相等查找概率的情形,若设树中所有内、外部结点的查找概率都相等:pi=qj=1/7,1 i 3,0 j 3 图(a):ASLsucc=1/7*3+1/7*2+1/7*1=6/7,ASLunsucc=1/
21、7*3*2+1/7*2+1/7*1=9/7。总平均查找长度 ASL=6/7+9/7=15/7。,图(a):ASL=15/7 图(d):ASL=15/7 图(b):ASL=13/7 图(e):ASL=15/7 图(c):ASL=15/7 图(b)的情形所得的平均查找长度最小。一般把平均查找长度达到最小的扩充二叉查找树称作最优二叉查找树,,在相等查找概率的情形下,因为所有内部结点、外部结点的查找概率都相等,把它们的权值都视为 1。同时,第 k 层有 2k 个结点,k=0,1,。则有 n 个内部结点的扩充二叉查找树的内部路径长度 I 至少等于序列 0,1,1,2,2,2,2,3,3,3,3,3,3,
22、3,3,4,4,的前n项的和。因此,最优二叉查找树的查找成功的平均查找长度和查找不成功的平均查找长度分别为:,(2)不相等查找概率的情形,设树中所有内、外部结点的查找概率互不相等,p1=0.5,p2=0.1,p3=0.05 q0=0.15,q1=0.1,q2=0.05,q3=0.05 图(a):ASLsucc=0.5*3+0.1*2+0.05*1=1.75,ASLunsucc=0.15*3+0.1*3+0.05*2+0.05*1=0.9。ASL=ASLsucc+ASLunsucc=2.65。图(a):ASL=2.65 图(d):ASL=2.15 图(b):ASL=1.9 图(e):ASL=1.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 静态 查找 二叉排序树 平衡 二叉 AVL 小结 树哈希表
链接地址:https://www.31ppt.com/p-5343707.html