[高等教育]第6章树和二叉树part4.ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[高等教育]第6章树和二叉树part4

第六章 树和二叉树 主讲:戚玉涛 第6章 树和二叉树 树的应用 树与等价问题 哈夫曼树与哈夫曼编码 树与等价问题 等价关系:设关系R定义在集合S上,对于任意的元素对( a,b ),a,b∈S,a R b 为真或为假。 等价关系R满足如下三个属性:??? (1)?自反性 :对于? a∈S,a R a 为真???? (2)?对称性 :a R b为真当且仅当 b R a?为真?? (3)?传递性 :若a R b,b R c为真 ,a R c为真 划分等价类 等价类:R是集合S的等价关系,由[x]R={ y| y∈S∧x R y } 给出的集合[x]R称为:由x∈S生成的一个R等价类。 划分:R是S上的等价关系,可以按R将S划分为若干不相交的子集 S1 ,S2,……, 它们的并即为S,则这些子集 Si就是S的R等价类。 划分等价类 假设集合S有n个元素,m个形如(x,y)的等价偶对确定了等价关系R,求S的划分。 一种确定等价类的算法: 1) 令S中每个元素各自形成一个只含单个成员的子集,记为S1 ,S2 ,…,Sn。 2) 重复读入m个偶对,对每个偶对(x,y),判断x和y所属的子集,设x∈Si,y∈Sj,若Si≠Sj,则将Sj并入Si,并置Sj为空。 3) 处理完m个偶对后剩下的非空子集就是S的R等价类。 划分等价类 由以上划分等价类的算法可以看出,划分等价类需要的基本操作有以下3个: 1) 构造只含单个元素的集合 2) 判定某个元素所属集合 3) 合并两个互不相交的集合 由此,需要一个包含上述三种操作的抽象数据类型MFSet(Merge Find Set) ADT MFSet ADT MFSet:若S是MFSet类型的集合,则它由子集Si构成,S1∪S2∪…∪Sn=S。 基本操作: Initial(S,n,x1,x2,…,xn):构造由n个子集构成的集合S,每个子集只含单个元素。 Find(S,x):查找x所属的子集Si。 Merge(S,i,j):合并两个不相交的集合Si和Sj。 MFSet类型的实现 根据Find和Merge两个操作的特点,用树来实现MFSet。 以森林F=(T1,T2,…,Tn)表示MFSet类型的集合S,每颗树Ti表示一个子集Si。 树中每个结点表示子集中的一个成员x。 令每个结点中包含一个指向其双亲的指针。 约定根结点兼作子集的名称。 int find_mfset(MFSet S, int i) // Find操作 { if (i1 || iS.n) return -1; for (j=i;S.nodes[j].parent0;j=S.node[j].parent) ; return j; } Status merge_mfset(MFSet S,int i,int j) // merge操作 { if (i1 || iS.n || j1 || jS.n) return ERROR; S.node[i].parent=j; //将一棵树的根指向另一棵树的根 return OK; } 时间复杂度分别为O(d)和O(1),d为树的深度 极端情况: 改进方法? MFSet类型实现的改进 改进思想: Merge时,总是将成员少的子集根结点指向含成员多的子集的根。 为此要相应地修改存储结构:令根结点的parent域存储子集中所含成员数目的负值。 可以将find_mfset的复杂度降到O(log2n) Status mix_mfset(MFSet S, int i, int j) { if (i1 || iS.n || j1 || jS.n) return ERROR; if (S.nodes[i].parentS.nodes[j].parent) { S.nodes[j].parent += S.nodes[i].parent; S.nodes[i].parent = j; }else{ S.nodes[i].parent += S.nodes[j].parent; S.nodes[j].parent = i; } return OK; } MFSet类型实现的改进 进一步的改进:Find时压缩路径 当所查元素不在第二层时,将所有从根到该元素路径上的元素都变成根结点的孩子 第6章 树和二叉树 树的应用 树与等价问题 哈夫曼树与哈夫曼编码 哈夫曼树 路径长度:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径, 路径上的分支数目称做路径长度。 树的路径长度:从树根到每一结点的路径长度之和。 结点的权和带权路径长度:给树的每个结点赋予一个具有某种实际意义的实数,我们称该实数为这

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档