问题 算法在树中查找最大独立集


我需要一个算法来查找树中的最大独立集。我想从所有叶节点开始,然后删除直接父节点到这些叶节点,然后选择我们删除的父节点的父节点,递归地重复这个过程,直到我们到达root。这是在O(n)时间内完成的吗?任何回复表示赞赏。谢谢。

并且有人可以请指出一个算法来找到树中的最大支配集。


7760
2017-11-24 18:29


起源

我没有得到你的问题,max独立设置意味着什么?你想要节点有最大值还是什么?因为您描述的方法在二叉树中将有2 ^ n个叶节点。那么,从哪里开始,简要介绍一下树的实现是二叉树吗? - Omkant
所以找到最大独立集(en.wikipedia.org/wiki/Maximal_independent_set)给出n个节点的通用树。 - fgb
为简单起见,只考虑一个完整的二叉树。 - starcaller
你想要一个 最大 独立集(最大可能大小之一)或a 最大 独立集(一个不能再添加顶点的集合)?最大独立集显然是最大的,但更容易找到不一定最大的最大独立集(所有树都是二分的,所以只取两部分的一边)。 - David Richerby


答案:


最大独立集

您可以通过树中的深度优先搜索来计算最大独立集。

搜索将为图中的每个子树计算两个值:

  1. A(i)=以i为根的子树中的最大独立集的大小,其约束为节点i必须包含在集合中。
  2. B(i)=以i为根的子树中的最大独立集的大小,其限制是节点i不得包含在集合中。

这些可以通过考虑两种情况递归计算:

  1. 子树的根不包括在内。

    B(i)=儿童j的总和(max(A(j),B(j))(i))

  2. 包含子树的根。

    A(i)= 1 +总和(儿童(i)中j的B(j))

整棵树中最大独立集的大小为max(A(root),B(root))。

最大限定集

根据 维基百科中支配集的定义 最大支配集总是平凡地等于包括图中的每个节点 - 但这可能不是你的意思?


15
2017-11-24 19:52



我认为最小支配集不等于最大/最大独立集。一颗星是一棵树,在那里它们显然是不相等的,或者我错过了吗?最小支配集不应该是最大独立集的补充吗? - yassin
@yassin好点,我删除了那部分 - Peter de Rivaz
如果负重与每个节点相关联怎么办?上述解决方案仍然正确吗? - Loc Huynh


  • 为了找到最大的独立顶点集,我们可以使用树的一个重要属性:每个树都是二分的,即我们可以仅使用两种颜色对树的顶点着色,使得没有两个相邻的顶点具有相同的颜色。

  • 执行DFS遍历并使用BLACK和WHITE开始着色顶点。

  • 选择更多数量的顶点集(BLACK或WHITE)。这将为您提供树的最大独立顶点集。

这个算法工作原理背后的一些直觉:

  • 让我们首先重新审视最大独立顶点集的定义。我们必须只选择边缘的一个端点,我们必须覆盖满足此属性的树的每个边缘。我们不允许选择边缘的两个端点。

  • 现在,图的双重组合有什么作用?它简单地将顶点集划分为两个子集(WHITE和BLACK),WHITE彩色顶点直接连接到BLACK。因此,如果我们选择所有WHITE或所有BLACK,我们固有地选择一组独立的顶点。从而选择最大独立 设置,去寻找尺寸较大的子集。


0
2018-05-19 04:33



这是不正确的。它发现了一个 最大 独立集(一个没有顶点可以添加)但不是a 最大 独立集(最大可能基数之一)。考虑通过采用边xy并添加两个与x相邻的叶和两个与y相邻的叶形成的树。最大独立集是所有叶子:四个顶点。但是图的每一侧只包含三个顶点。 - David Richerby
你不能计算最多2种方式:1)BLACK或WHITE列表的最大值2)执行BLACK和WHITE着色但每次到达叶子节点时将它添加到叶子节点的最大独立集合中返回的最大列表(1) )或(2)是最终答案。 - Alex Spencer