收藏 分享(赏)

动态查找表.ppt

上传人:fmgc7290 文档编号:8292022 上传时间:2019-06-18 格式:PPT 页数:59 大小:3.18MB
下载 相关 举报
动态查找表.ppt_第1页
第1页 / 共59页
动态查找表.ppt_第2页
第2页 / 共59页
动态查找表.ppt_第3页
第3页 / 共59页
动态查找表.ppt_第4页
第4页 / 共59页
动态查找表.ppt_第5页
第5页 / 共59页
点击查看更多>>
资源描述

1、数据结构与算法,9.2 动态查找表,什么是动态查找表? 查找表中的数据随着查找的结果而发生改变。,查找,成功:删除该数据元素,失败:插入该数据元素,数据结构与算法,9.2.1 二叉排序树,定义二叉排序树(BST):或者是一棵空的二叉树,或者是: 非空左子树上所有结点的值均小于根结点的值; 非空右子树上所有结点的值均大于根结点的值; 它的左右子树也都是二叉排序树。,数据结构与算法,性质 中序遍历是 有序序列 存储结构 采用二叉链表,9.2.1 二叉排序树,数据结构与算法,9.2.1 二叉排序树,查找算法 若二叉排序树为空,则查找不成功;否则 1)若给定值k等于根结点的关键字,则查找成功; 2)若

2、k小于根结点的关键字,则继续在左子树上查找; 3)若k大于根结点的关键字,则继续在右子树上查找。,查35,数据结构与算法,9.2.1 二叉排序树,int SearchBST ( T, k) / 在树T中查找关键字为k的元素if (T=Null) return False; / 查找不成功else if ( k =T-data.key) return Treu; / 查找成功else if ( kdata.key) / 在左子树中继续查找SearchBST (T-lchild, k ); else / 在右子树中继续查找SearchBST (T-rchild, k); ,改进:为方便插入与删除,

3、查找结束时记住k的双亲位置,数据结构与算法,9.2.1 二叉排序树,int SearchBST ( T, k , ,数据结构与算法,9.2.1 二叉排序树,插入算法在查找不成功的情况下,尚需插入关键字等于给定值k的元素: 算法:若二叉排序树为空树,则新插入的结点为根结点; 否则,新插入的结点必为一个新的叶子,其插入位置由查找过程中得到。,数据结构与算法,9.2.1 二叉排序树,插入算法 在BST中插入值为k的结点,步骤如下:, 若树为空,则生成值为k的根结点; 若k小于根,在根的左子树中插入; 若k大于根,在根的右子树中插入; 若k等于根结点的值,表明二叉排序树中已有此关键字,则无须插入。,数

4、据结构与算法,9.2.1 二叉排序树,int Insert-BST(T , k) /在T中插入值为k的结点if (T=NULL) T=(BiNode*)malloc(sizeof(BiNode); /插入为根T-key=k;T-lchild=T-rchild=NULL; return Ok;else if (kkey) /插入到左子树Insert-BST(T-lchild, k); else if (kT-key) /插入到右子树Insert-BST(T-rchild, k); else return False;,数据结构与算法,9.2.1 二叉排序树,int Insert-BST(BiTr

5、ee / 树中已有关键字相同的结点,不再插入 ,数据结构与算法,9.2.1 二叉排序树,建立二叉排序树 在一棵空树上不断地插入结点,Bitree Creat-BST(int a , int n) /将a中的n个数据插入BST Bitree root;root = NULL;for (i = 0; i n; i+)Insert-BST (root, ai); /调用插入函数return root ,数据结构与算法,9.2.1 二叉排序树,例:设有一个输入数据的序列是 46, 25, 78, 62, 12, 37, 70, 29 , 试画出二叉排序树。,数据结构与算法,9.2.1 二叉排序树,删除

6、算法在二叉排序树上删除某个结点之后,仍然保持二叉排序树的特性。 思想:分三种情况讨论 被删除的结点是叶子; 被删除的结点只有左子树或者只有右子树; 被删除的结点左右子树均非空。,叶子,只有左子树,左右子树非空,只有右子树,数据结构与算法,9.2.1 二叉排序树,删除算法 被删结点是叶子的情形:将双亲的相应孩子指针置“空”,数据结构与算法,9.2.1 二叉排序树,删除算法 删除单支结点的情形将双亲结点的相应指针指向被删除结点的子树。,数据结构与算法,9.2.1 二叉排序树,删除算法 删除双支结点的情形: 方法1:以其前驱(左子树中的最大值)替代之,然后再删除该前驱结点。,数据结构与算法,9.2.

7、1 二叉排序树,删除算法 删除双支结点的情形: 方法2:将其右子树作为左子树最右边的子树,然后将其左子树作为双亲的子树,。,数据结构与算法,9.2.1 二叉排序树,性能分析 对不同形态的二叉排序树,其平均查找长度差别较大。 例:输入相同的数据,输入顺序不同,得到不同形态的二叉排序树。,输入:3,12,5,4,91,11,输入:3,4,5,11,12,91,ASL=(1+2*2+3*3)/62.33,ASL=(1+2+3+4+5+6)/6=3.5,数据结构与算法,9.2.2 平衡二叉树,定义 具有下列性质的二叉排序树: 根结点的左子树和右子树的深度最多相差1; 子树也都是平衡二叉树(AVL)。,

8、数据结构与算法,9.2.2 平衡二叉树,平衡因子结点的左子树的深度与右子树的深度之差。 由平衡二叉树定义可知,平衡二叉树所有结点的平衡因子只能取1,0,1三个值之一。,数据结构与算法,9.2.2 平衡二叉树,平衡二叉树的建立每输入一个结点时,若发现不平衡,则在满足二叉排序树的前提下,旋转为平衡的。例:输入3,5,7,2,90 建立AVL,此时,失去平衡, 如何旋转?,数据结构与算法,9.2.2 平衡二叉树,(1)LL型的平衡旋转,数据结构与算法,9.2.2 平衡二叉树,(1)LR型的平衡旋转,数据结构与算法,9.2.2 平衡二叉树,(1)RL型的平衡旋转,数据结构与算法,9.2.2 平衡二叉树

9、,(1)RR型的平衡旋转,数据结构与算法,9.2.2 平衡二叉树,例:输入 4,5,7,2,1,3,6,建立平衡的二叉排序树(AVL),RR型,数据结构与算法,9.2.2 平衡二叉树,LL型,数据结构与算法,9.2.2 平衡二叉树,LR型,数据结构与算法,9.2.2 平衡二叉树,RL型,数据结构与算法,9.2.3 B树与B+树,B树 B树是一种平衡的多路查找树,它在文件系统中很有用。,数据结构与算法,9.2.3 B树与B+树,B树 一棵m阶的B树,或者为空树,或为满足下列特性的m叉树: 每个结点至多有m棵子树。 若根结点不是叶子结点,则至少有2棵子树。 除根结点之外的所有非叶结点至少有m/2

10、棵子树。 非叶结点中的多个关键字均自小至大有序排列,即:K1 K2 Kn;且Ai-1所指子树上所有关键字均小于Ki;Ai所指子树上所有关键字均大于Ki;,数据结构与算法,9.2.3 B树与B+树,B树 B树主要用于外部查找(即,该查找表存储在外存) B树是一种动态查找树 B树的查找类似于二叉排序树 B树中插入一个元素时,为限制结点中关键字的个数,可能会“分裂”结点。 B树中删除一个元素时,可能会“合并”结点。,数据结构与算法,9.2.3 B树与B+树,B+树应文件系统所需而产生的一种B树的变形树。,数据结构与算法,9.3 hash表,引入前面讨论的查找方法,查找时需要进行一系列对关键字的“比较

11、” 。 将关键字与存储位置之间建立一种对应关系,理想的情况下,不需要比较即可进行查找。,数据结构与算法,9.3 hash表,什么是hash表? 以数据元素的关键字K为自变量,通过一个确定的函数关系,计算出对应的函数值f(K),把这个值作为其的存储位置。查找时,根据这个函数计算其存储位置。 Hash表便是存储数据元素的查找表,数据结构与算法,9.3 hash表,Hash表实例,数据结构与算法,9.3 hash表,若对于不相等的关键字计算出了相同的hash地址,则称该现象为hash冲突,发生冲突的两个关键字为该Hash函数的同义词。在实际应用中,不产生冲突的Hash函数极少存在。,【例】 假设一组

12、记录的关键字分别为17,27,1,20,22,6,10,13,41,15,25。选取关键字与记录位置间的函数为f(key)=key %11。,17, 6,数据结构与算法,9.3 hash表,两个主要问题 如何设计hash函数? 冲突怎么解决?,数据结构与算法,9.3.2 Hash函数的构造方法,要点 如果hash表有m个地址,则hash函数值域必须为0-m; Hash函数计算出来的地址应能“均匀”的分布在整个地址空间; Hash函数应是简单的,能在短时间内计算出来。,数据结构与算法,9.3.2 Hash函数的构造方法,直接定址法此类函数取关键码的某个线性函数值作为散列地址:Hash( key

13、)a * key +b a, b为常数 这类散列函数是一对一的映射,一般不会产生冲突。但是,它要求散列地址空间的大小与关键码集合的大小相同。,数据结构与算法,9.3.2 Hash函数的构造方法,示例:有一组关键码如下: 942148, 941269, 940527, 941630, 941805, 941558, 942047, 940001 。散列函数为Hash (key) = key - 940000则有Hash (942148) = 2148 Hash (941269) = 1269Hash (940527) = 527 Hash (941630) = 1630Hash (941805)

14、 = 1805 Hash (941558) = 1558Hash (942047) = 2047 Hash (940001) = 1可以按计算出的地址存放记录。,数据结构与算法,9.3.2 Hash函数的构造方法,数字分析法设有 n 个 d 位数,每一位可能有 r 种不同的符号。这 r 种不同的符号在各位上出现的频率不一定相同,选取其中各种符号分布均匀的若干位作为散列地址。,9 4 2 1 4 8 9 4 1 2 6 9 9 4 0 5 2 7 9 4 1 6 3 0 9 4 1 8 0 5 9 4 1 5 5 8 9 4 2 0 4 7 9 4 0 0 0 1 ,选位,数据结构与算法,9.3

15、.2 Hash函数的构造方法,除留余数法,设hash表的长度 m,hash函数为: hash ( key ) = key % p p m其中, “%”是整数除法取余的运算,p为质数。 示例:有一个关键码 key = 962148,散列表大小 m = 25,取质数 p= 23。则hash地址为:,hash ( 962148 ) = 962148 % 23 = 12。,数据结构与算法,9.3.2 Hash函数的构造方法,平方取中法,此方法在词典处理中使用十分广泛。它先计算构成关键码的标识符的内码的平方,然后按照散列表的大小取中间的若干位作为散列地址。,标识符 内码 内码的平方 散列地址 A 01

16、01 001 A1 0134 20420 042 AMAX 01150130 135423617100 236,例,数据结构与算法,9.3.2 Hash函数的构造方法,折叠法,把关键码等分成几部分,把这些部分的数据叠加起来作为hash地址。,例 key = 23938587841 ,关键码可划分为 4段:239 385 878 41,数据结构与算法,9.3.3 处理冲突的方法,什么是冲突?对于不同的关键字可能得到同一哈希地址,即key1key2,但h(key1)=h(key2),这种现象叫冲突。 具有相同函数值的两个关键字对该哈希函数来说称做“同义词”。 在一般情况下,冲突只能尽可能地少,而不

17、能完全避免,数据结构与算法,9.3.3 处理冲突的方法,开放定址法,当冲突发生时,形成一个探查序列;沿此序列逐个地址探查,直到找到一个空位置(开放的地址)。即 Hi=(H(key)+di) MOD m,i=1,2,k (km-1),其中:H(key)哈希函数,m哈希表表长,di增量序列,di有下列三种取法,线性探测再散列:di=1,2,3,m-1,二次探测再散列:di=1,-1,2,-2,k (km/2),伪随机探测再散列:di=伪随机数序列,数据结构与算法,9.3.3 处理冲突的方法,例: 有关键字序列为 36,7,40,11,16,81,22,8,14 ,Hash表表长m =11,用线性探

18、测法处理冲突,建立Hash表:H(key)=key % 7,冲突时:Hi=(H(key)+di) % m, di=1,2,3,m-1,冲突次数,0 0 2 0 2 6 8,数据结构与算法,9.3.3 处理冲突的方法,链地址法 将所有关键字为同义词的结点链接在同一个单链表中,Hash(key)=key % 11,数据结构与算法,9.3.4 hash表的查找及性能,Hash表的查找查找过程和造表过程一致。假设采用开放定址处理冲突,则查找过程为:,1. 对于给定值K, 计算哈希地址 i = H(K) 2. if (ri 为空) 查找失败;else if ( ri.key = K ) 查找成功;els

19、e 求下一地址i = Hi;3. 重复2.,数据结构与算法,9.3.4 hash表的查找及性能,typedef struct ElemType *elem; /hash表int count; /表中元素个数HashTable;,14,1,68,27,55,19,20,84,79,23,11,10,Hash表结构,数据结构与算法,9.3.4 hash表的查找及性能,查找(开放定址解决冲突),SearchHash(HashTable H, k, int /失败 ,数据结构与算法,9.3.4 hash表的查找及性能,插入一个元素,InsertHash(HashTable /失败 ,数据结构与算法,例

20、 已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79), 哈希函数为:H(key)=key MOD 13, 哈希表长为m=16,用线性探测再散列处理冲突,H(55)=3 冲突,H1=(3+1)MOD16=4冲突,H2=(3+2)MOD16=5,H(79)=1 冲突,H1=(1+1)MOD16=2冲突,H2=(1+2)MOD16=3冲突,H3=(1+3)MOD16=4冲突,H4=(1+4)MOD16=5冲突,H5=(1+5)MOD16=6冲突,H6=(1+6)MOD16=7冲突,H7=(1+7)MOD16=8冲突,H8=(1+8)MOD16=9,H(19)=6,

21、H(14)=1,H(23)=10,H(1)=1 冲突,H1=(1+1) MOD16=2,H(68)=3,H(20)=7,H(84)=6 冲突,H1=(6+1)MOD16=7冲突,H2=(6+2)MOD16=8,H(27)=1 冲突,H1=(1+1)MOD16=2冲突,H2=(1+2)MOD16=3冲突,H3=(1+3)MOD16=4,H(11)=11,H(10)=10 冲突,H1=(10+1)MOD16=11冲突,H2=(10+2)MOD16=12,ASL=(1*6+2+3*3+4+9)/12=2.5,数据结构与算法,9.3.4 hash表的查找及性能,删除一个元素,例 已知一组关键字(19,

22、14,23,1,68,20,84,27,55,11,10,79), 哈希函数为:H(key)=key MOD 13, 哈希表长为m=16,用线性探测再散列处理冲突,删除14,要避免因删除发生“断裂”找不到同义词!,数据结构与算法,9.3.4 hash表的查找及性能,查找性能决定哈希表查找的ASL的因素: 选用的哈希函数; 选用的处理冲突的方法; 装载因子值的大小,反映哈希表饱和的程度。,数据结构与算法,9.3.4 hash表的查找及性能,查找性能 线性探测再散列链地址法伪随机探测再散列,关于的函数,数据结构与算法,9.3.4 hash表的查找及性能,说明 Hash表的平均查找长度是的函数,而不是n的函数。因此,不管n多大,总可以选择一个合适的,以便将平均查找长度限定在一个范围内。 对于预先知道且规模不大的关键字集,有时可以找到不发生冲突的hash函数。因此,对频繁查找的关键字集,还应尽力设计一个完美的hash函数。,数据结构与算法,谢谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报