数据结构及应用算法教程(修订版) 数据结构_第8章_查找表.ppt
《数据结构及应用算法教程(修订版) 数据结构_第8章_查找表.ppt》由会员分享,可在线阅读,更多相关《数据结构及应用算法教程(修订版) 数据结构_第8章_查找表.ppt(94页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第8章 查找表 8.1 静态查找表 8.1.1 顺序查找 8.1.2 折半查找 8.1.3 分块查找 8.2 动态查找树表 8.2.1 二叉查找树 8.2.2 键树 8.3 哈希表及其查找 8.3.1 什么是哈希表? 8.3.2 构造哈希函数的几种方法 8.3.3 处理冲突的方法和建表示例 8.3.4 哈希表的查找及其性能分析 8.3.5 哈希表的的应用举例,何谓查找表 ? 查找表是由同一类型的数据元素(或记录)构成的集合。 由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。 对查找表经常进行的操作: 1)查询某个“特定的”数据元素是否在查找表中; 2)检索某个“特
2、定的”数据元素的各种属性; 3)在查找表中插入一个数据元素; 4)从查找表中删去某个数据元素。,查找表可分为两类: 静态查找表(static search table):仅作查询和检索操作的查找表。 动态查找表(dynamic search table):有时在查询之后,还需要将“查询”结果为“不在查找表中”的数据元素插入到查找表中;或从查找表中删除其“查询”结果为“在查找表中”的数据元素。 关键字:是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)。 若此关键字可以识别唯一的一个记录,则称之谓“主关键字”。若此关键字能识别若干记录,则称之谓“次关键字”。,查找:根据
3、给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)。若查找表中存在这样一个记录,则称“查找成功”。查找结果给出整个记录的信息,或指示该记录在查找表中的位置; 否则称“查找不成功” , 查找结果给出“空记录”或“空指针”。 如何进行查找?查找的方法取决于查找表的结构。 由于查找表中的数据元素之间不存在明显的组织规律,因此不便于查找。 为了提高查找的效率,需要在查找表中的元素之间人为地 附加某种确定的关系,换句话说,用另外一种结构来表示查找表。,8.1 静态查找表 静态查找表的基本操作: Create( /数据元素存储空间基址,建表时按实际长度分配,0号单元留空 int len
4、gth; /表的长度 SSTable; 数据元素类型的定义为: typedef struct KeyType key; /关键字域 /其它属性域 ElemType;,8.1.1 顺序查找 以顺序表或线性链表表示的静态查找表 查找过程: (1)从第一个元素的关键字起,依次向后和给定值相比较直至相等或不存在。 (2)从最后一个元素的关键字起,依次向前和给定值相比较直至相等或不存在。,ST.elem,回顾顺序表的查找过程:,假设给定值 e=64, 要求 ST.elemk = e, 问: k = ?,7,ST.elem,i,ST.elem,i,60,i,key=64,key=60,i,64,int S
5、earch_Seq(SSTable ST, KeyType kval) / 在顺序表ST中顺序查找其关键字等于kval的数 /据元素。若找到,则函数值为该元素在表中的 /位置,否则为0。 ST.elem0.key = kval; / “哨兵” for (i=ST.length; ST.elemi.key!=kval; -i ) ; / 从后往前找 return i; / 找不到时,i为0 / Search_Seq,算法8.1:,顺序查找的时间性能: 即查找算法的平均查找长度(Average Search Length) 为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值: AS
6、L=(n+1)/2 其中:n 为表长,8.1.2 折半查找 当以顺序有序表表示静态查找表时,查找过程可按“折半”进行。 折半查找(又称二分查找):查找过程是,先确定待查记录所在范围,然后拿给定值与范围的中间位置记录的关键字比较,若相等,表示成功;否则缩小范围。重复操作,直至找到该记录,或者当查找区间缩小到 0也没有找到关键字等于给定值的记录为止。,ST.elem,ST.length,例如: key=64 的查找过程如下:,low,high,mid,low,mid,high,mid,low 指示查找区间的下界 high 指示查找区间的上界 mid = (low+high)/2,int Searc
7、h_Bin(SSTable ST, KeyType kval) low=1; high=ST.length; while (low=high) mid=(low+high)/2; if (kval=ST.elemmid.key) return mid; else if (kvalST.elemmid.key) high=mid-1; else low=mid+1; /while return 0 /Search_Bin,算法8.2:,6,3,9,1,4,2,5,7,8,10,11,分析折半查找的平均查找长度 先看一个具体的情况,假设:n=11 ASL=(1+2*2+3*4+4*4)/11=33
8、/11=3,1,2,2,3,3,3,3,4,4,4,4,可以用一棵二叉树来描述折半查找过程,称此树为判定树。 二叉树中结点的值表示有序表中记录的序号 左右子树结点数相等或最多相差一个(左少右多) 判定树上每个结点需要查找的次数刚好为该结点所在的层数 查找成功时查找次数不会超过判定树的深度 一般情况下,表长为n的折半查找的判定树的深度和含有n个结点的完全二叉树的深度相同。 平均查找长度为:,8.1.3 分块查找 分块查找也称索引顺序查找,其性能介于顺序查找和折半查找之间,适合于关键字分块有序的查找表。 分块有序:查找表中的记录可按其关键字的大小分成若干块,且前一块中的最大关键字小于后一块中的最小
9、关键字,而各块内部的关键字不一定有序。 索引查找思想:为每一块建立一个索引项,包括两个域:一个是该块中最大的关键字的值;一个是该块的起始位置, 由于查找表分块有序,则索引表为有序表。 查找过程:分两步进行:首先要在索引表中查找以确定元素所在的块(采用简单顺序查找或折半查找);然后在所确定的块中进行查找(顺序查找)。,例 8.3,ST.elem,索引表,块内最大关键字 块的起始序号,typedef struct KeyTypekey; int stadr; indexItem; typedef struct indexItem*elem; intlength; indexTable;,int S
10、earch_Idx ( SSTable ST, indexTable ID, KeyType kval ) /在顺序表ST中分块查找其关键字等于给定值kval的数据元素, /ID为索引表。若找到,则返回该数据元素在ST中的位置,否则 /返回0 -算法8.3 low = 0; high = ID.length-1; found = FALSE; if (kvalID.elemhigh.key) return 0; / 给定值kval大于查找表中所有关键字 while ( low ID.elemmid.key ) low = mid +1; else found = TRUE; low = mid
11、; /while,s = ID.elemlow.stadr; / 经索引表查找后,下一步的查找范围定位在第low块 if ( low ID.length-1 ) t = ID.elemlow +1.stadr-1; else t = ST.length; / s和t为在ST表进行查找的下界和上界,若不是最后一块,则 /上界为“下一块的起始位置之前” if ( ST.elemt.key= kval ) return t; else / 在ST.elems 至ST.elemt-1的区间内进行顺序查找 ST.elem0 = ST.elemt; / 暂存ST.elemt ST.elemt.key =
12、kval; / 设置监视哨 for ( k=s; ST.elemk.key !=kval; k+ ) ; ST.elemt = ST.elem0; / 恢复暂存值 if ( k != t ) return k; else return 0; / else / Search_Idx,分块查找性能分析: 设顺序表长度为n,被均匀的分成b块,即索引表的长度为b,则: ASLidx=ASL(b)+ASL(n/b)log2(b+1)-1+(n/b+1)/2 索引查找典型应用:查字典,8.2 动态查找表 在程序运行过程中动态生成的查找表。对动态查找表常进行的操作为插入和删除,表示动态查找的方法:查找树和哈
13、希表。 基本操作: InitDSTable( struct BiTNode *lchild, *rchild; / 左右孩子指针 BiTNode, *BiTree;,2二叉排序树的查找算法: 若二叉排序树为空,则查找不成功,否则, 1)若给定值等于根结点的关键字,则查找成功; 2)若给定值小于根结点的关键字,则继续在左子树上进行查找; 3)若给定值大于根结点的关键字,则继续在右子树上进行查找。 查找树: 具有“通过和根结点关键字的比较可将继续查找的范围缩小到某一棵子树中”特性的二叉树或树。二叉排序树又称二叉查找树(binary search tree),50,30,80,20,90,85,40
14、,35,88,32,例如:二叉排序树,查找关键字,= 50 ,50,50,35 ,50,30,40,35,50,90 ,50,80,90,95 ,查找的递归算法: BiTree SearchBST(BiTree T , KeyType key) /在根指针T所指二叉排序树中递归地查找某关键字等于key /的数据元素,若查找成功,则返回指向该数据元素的指针,否 /则返回空指针。 if(!T | key= =T-data.key) return T; /查找结束 else if(keydata.key) return ( SearchBST( T-lchild , key) ); /在左子树中继续
15、查找 else return ( SearchBST( T-rchild , key) ); /在有子树中继续查找 /SearchBST,查找算法8.4: bool Search_BST (BiTree T, KeyType kval, BiTree / 查找不成功 / SearchBST,假设 kval = 48,kval=24,return TRUE,return FALSE,3二叉排序树的插入算法 根据动态查找表的定义,“插入”操作在查找不成功时才进行; 若二叉排序树为空树,则新插入的结点为新的根结点;否则, 新插入的结点必是一个新的叶子结点,并且是查找路径上访问的最后一个结点的左孩子或
16、右孩子。 举例:从空树出发,插入下列关键字,构造一棵二叉排序树(40,88,55,96,18,09,20,13,19),插入算法8.5: bool Insert_BST(BiTree /else / Insert_BST,T=NULL,kval=50,30,40,80,20,36,90,40,38,4.二叉排序树的删除算法 和插入相反,删除在查找成功之后进行。对于二叉排序树,删去树上一个结点相当于删去有序序列中的一个元素,只要在删除某个结点之后,仍然保持二叉排序树的特性即可。 可分三种情况讨论: 被删除的结点是叶子结点,直接删除; 被删除的结点只有左子树或者只有右子树,则将其孩子直接挂到其双亲
17、上; 被删除的结点既有左子树,也有右子树,找左孩子中最大的一个元素,代替被删除结点,最大元素最多只有一个左子树,按处理删除最大元素。,50,30,80,20,90,85,40,35,88,32,(1)被删除的结点是叶子结点,例如:,被删关键字 = 20,88,其双亲结点中相应指针域的值改为“空”,50,30,80,20,90,85,40,35,88,32,(2)被删除的结点只有左子树或者只有右子树,其双亲结点的相应指针域的值改为“指向被删除结点的左子树或右子树”。,被删关键字 = 40,80,50,30,80,20,90,85,40,35,88,32,(3)被删除的结点既有左子树,也有右子树,
18、40,40,以其前驱替代之,然后再删除该前驱结点,被删结点,前驱结点,被删关键字 = 50,二叉查找树删除算法8.6 void Delete_BST (BiTree / if,else if (!p-rchild) / 右子树空则只需挂接它的左子树 q = p; p = p-lchild; /if else / 左子树空,只需挂接它的右子树 q = p; p = p-rchild; / 将指针p所指子树挂接到被删结点的双亲(指针f所指的)结点上 if (!f) T = p; / 被删结点为根结点 else if (q = f-lchild) f-lchild = p; else f-rchil
19、d = p; / 完成子树的挂接 delete q; / 释放被删结点空间 /else /if /Delete_BST,二叉排序树的查找分析 在二叉查找树上查找关键字等于给定值的过程,与给定值比较的关键字的个数和结点所在的层次相等,最多不会超过二叉查找树的深度。可以证明,二叉查找树的平均查找长度: P(n)2(n1)/n *logn+C 同样的n个关键字,若先后插入的顺序不同, 构造出的二叉排序树的形态不同。如关键字序列(1,2,3,4,5),若输入序列为:1,2,3,4,5,则 ASL=3,而输入序列为:3,1,4,2,5,则ASL=2.2。,最好的二叉排序树形态是n个关键字的折半查找对应的
20、判定树O(log2n)。 最坏的二叉排序树形态是链表形态O(n)。 二叉排序树的平均查找长度和折半查找是同一数量级log2n,但不如折半查找好。 5.平衡二叉树(Balanced Binary Tree) (1)定义:或是空树,或是具有如下性质的二叉树,它的左右子树也都是平衡二叉树,且左子树和右子树的深度之差的绝对值不大于1。,(2)平衡二叉树的深度:log2n (n为结点个数) (3)结点的平衡因子(Balance Factor):是左子树深度减去右子树深度,它只可能是:-1、0、1。,例如:,平衡树,小结: 查找表:静态查找表、动态查找表、关键字、查找 静态查找表 顺序查找:ASLs=(n
21、+1)/2、ASLus=n+1 折半查找:判定树、ASLs=(n+1)/n*log2(n+1)-1log2(n+1)-1 分块查找:索引表、ASLs=ASL(b)+ASL(n/b) 动态查找表:二叉查找树、查找、插入、删除算法 P(n)=2(n+1)/n*log2n+C 平衡二叉树:|hL-hR|1,(4)如何构造平衡二叉树(平衡旋转技术) 在平衡的二叉排序树中插入一个结点,当出现不平衡时,根据不平衡情况分四种调整方法 假设最低不平衡结点为A,根据新插入结点与A的位置关系来命名调整方法: LL型:新插入结点在A的左孩子(L)的左子树(L)中; LR型:新插入结点在A的左孩子(L)的右子树(R)
22、中; RL型:新插入结点在A的右孩子(R)的左子树(L)中; RR型:新插入结点在A的右孩子(R)的右子树(R)中。 AVL树:根据Adelson-Velskii和Landis提出的动态平衡方法构造的平衡二叉排序树。,LL型(图示),C,LL型,A,BL,BR,AR,h+2,h,LL型,A,B,BL,BR,AR,LR型(图示),C,LR型,C,B,A,BL,CL,AR,h+2,h,LR型,A,C,CR,AR,C,CR,B,BR,CL,RL型(图示),A,B,C,RL型,B,A,B,AL,CL,BR,h,h+2,RL型,B,C,CR,BR,C,CR,A,AR,CL,RR型(图示),A,B,C,R
23、R型,C,A,B,BL,BR,AR,h+2,h,RR型,A,B,BL,AR,BR,练习:依次输入下列数据构造一棵平衡二叉树:100,90,80,60,70,50,120,110,150,87。,100,90,80,LL型,90,80,100,60,70,LR型,90,70,100,60,80,50,LL型,90,70,100,60,80,50,120,110,90,70,100,60,80,50,120,110,RL型,90,70,110,60,80,50,100,120,150,RR型,70,60,50,110,90,80,100,120,150,练习:依次输入下列数据构造一棵平衡二叉树:1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构及应用算法教程修订版 数据结构_第8章_查找表 数据结构 应用 算法 教程 修订版 查找
限制150内