无根树【信息技术】.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
树的枚举与计数 引子 树,在计算机算法中是非常重要的非线形结构。即使撇开树的其他广泛应用不说,单单对树本身的形态进行思考与研究,也是一个十分有趣,且具有挑战性的过程。例如,我们想要知道,有着4个不可区别的结点的树有几棵? 那么有n个结点的呢?如果再给这样的树加上深度的限制,是不是也可以解决?这些树的形态又是怎样的?它们之间有着什么样的联系?推广到无根树,问题会有怎样的发展? 下面,我们就集中力量来逐一解答这一系列的问题。在这个探索与讨论的过程中,随着有关树的枚举与计数的算法的得出,各种不同形态的树将会以一种优美的“序”为基础被一一展示出来。 一些概念 在深入的讨论之前,我们有必要首先将有关的基本概念明确一下。 树的定义 “一般地说,树结构是指结点之间的‘分枝’关系,很象是在自然界的树那样。” ——《计算机程序设计技巧》 我们对一个树的正式定义是:一个或多个结点的有限集合T,使: 有一个特别标出的称为该树的根root的结点,以及 剩下的结点(除根外)被分成m≥0个不相交的集合T1,…,Tm,而且这些集合的每一个又都是树,树T1,…,Tm被称为这个根的子树。 众所周知,对于树来说,递归的定义显得最为恰当,因为递归是树结构的一个固有特征(在后面的算法设计中,也尤其重视了树的递归特征)。 注意到,如果在定义的(b)中,子树T1,…,Tm的相对次序是重要的,那么这棵树被称为“有序树”。如果当两棵树的差别仅仅在于子树的相对次序时,我们一般不认为它们是不同的(即认为它们是同构的,如上图中的甲和乙,它们通过若干次子树交换可以变作和对方完全相同的树),我们称它们为“有向树”,因为此时我们考虑的只是这些结点的相对方向,而不是次序。在下文中的计数和枚举算法都是针对有向树而言的。 关于树的深度或者说是层数,在介绍数据结构的文献中有两种不同的定义,一种认为根结点在第1层,另一种认为在第0层。在本文下面的论述中,凡涉及树的深度的,都依据前一种概念。 无根树 同时作为本文重点讨论对象的还有无根树(自由树)。 “连通的无圈图称为自由树。如果选定自由树中的某个顶点作树根,以树根为起点对每条边定向,就能把一棵自由树变成一棵通常的树。” ——《数据结构与算法》 无根树是不含回路的图且恰有n-1条边。 顾名思义,无根树就是无父子关系而只有邻接关系的树。 容易发现,对某棵无根树,指定其一个结点为根后,我们将得到一棵“有根树”,而在将不同的有根树转化为无根树时,又经常得到相同的无根树,这也是同构现象。那么如何判定无根树的同构呢? 对于两棵无根树甲和乙,任取无根树甲的某个结点作为根结点,形成一棵有根树甲*,若存在以无根树乙的某结点为根的有根树乙*与甲*同构,则称甲乙两树同构(如下图)。 到此为止,我们已经给出了树和自由树的一些初步概念。可以预见,要对不同形态的树(以及无根树)进行高效的计数乃至枚举恐怕并非易如反掌。因为无论是有根树还是无根树,都存在极其普遍的同构现象。而且从上面的讨论来看,出现同构现象的原因是结点(子树)间缺乏“序”的关系。 树的计数算法 有向树的计数 让我们进入到头一个问题——有向树的计数。为了增加解答的通用性,我们将直接确定具有n个结点,深度为d 的有向树的个数。假设这样的有向树共有a[d,n]种。那么,具有n 个结点的有向树的个数就等于: 正如上文提到的,由于一棵有向树的子树是无序的,同构现象的大量滋生为计数工作制造了巨大的障碍。(当然,我们要考虑的有向树的计数或枚举算法决不是通过搜索所有有序树,通过一次次的判断和排除同构来实现的——这样做的效率将是十分低下的,因为这将是一个拥有指数级复杂度的算法,虽然不排除这种算法在小规模问题上的可行性,但仅仅通过局部的优化是无法改变其本质的。) 对于一棵有向树,除去根结点,对其子树进行排序。排序的规则简单说来就是:深度大的子树视为较大的子树,深度相同时,拥有结点数较多的子树视为较大的子树。(注意,虽然在计数算法中,只须对根结点的子树进行粗略的排序,但作为对这种排序规则的拓展,它应当也是递归的,这一点详见枚举算法。) 考虑这棵有向树的根结点的所有子树的组成情况,对于任意一种组成方式,设深度为d1,结点数为n1的子树有k1棵;深度为d2,结点数为n2的子树有k2棵;……深度为ds,结点数为ns的子树有ks棵……, 满足:d1=d, 且根据上面的排序规则,对任意的1≤ij≤s,有di≥dj,若di=dj,则必有ninj。由于形态不同的深度为di,结点数为ni的有向树的总数是a[di , ni],从中允许重复地选取ki棵,方案数无疑是:

文档评论(0)

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

1亿VIP精品文档

相关文档