当前位置: 首页 > 知识库问答 >
问题:

将加权树划分为等加权子树

桑博远
2023-03-14

输入:

    < li >具有< code>n个节点的有根树; < li >每个节点< code>p具有正整数权重< code > w(p); < li >一个节点可以有两个以上的子节点。

问题:

  • 将树划分为 k 个子树/分区(显然是通过删除 k-1 边缘);
  • 子树权重 W(p) 是根植于节点 p 的子树中所有节点的权重;
  • 所有子树的权重应尽可能均匀 - 最小(W(p))最大值(W(p))之间的差异应尽可能小。

我还没有找到合适的算法。我应该从哪里开始?提示、说明和伪代码。

共有1个答案

韶宏邈
2023-03-14

假设除了删除边以创建子树之外,您不能修改树。

首先要了解,您不能保证通过简单地删除边,您将在任意边界内拥有子树。您可以创建一棵树,当您拆分它们时,无法在目标边界内创建子树。例如:

a(b(c,d,e,f),g)

你不能把它分成两个平衡的部分。最好的方法是将边从a移到b:

a(g)和b(c,d,e,f)

此外,当k时,这个标准有点定义不足

但你可以想出一种方法,以尽可能平衡的方式将树拆分

实现您的树,使每个节点拥有其所有子节点的计数。您可以非常有效地将其添加到任何树中。(例如,当您添加一个节点时,您必须通过递增计数向上迭代父节点链。删除一个节点,然后从计数中向上迭代)

然后从根开始向下迭代,以广度优先的方式,直到找到一组以最平衡的方式支配子节点的节点。我没有现成的算法,但我认为你可以很容易地找到一个。

我认为当你想划分成k个子树时,你会创建一个k个树根的数组。这些节点中的一个必须始终是当前树的根,然后向下迭代,查找要替换的k-1个候选节点,以改进分区。您将需要某种终止条件,在这种条件下,您不会向下交互到每个叶节点。E、 g.用最大的候选节点细分任何东西都没有意义。

 类似资料:
  • 我试图通过DP找到所有子数组的加权平均值,然后按列排序,找到长度相同的2。但我无法继续下去,我的方法似乎太模糊/太粗暴了。我将非常感谢任何帮助。提前谢了。

  • 问题内容: 我有一张事件表,另一个是评分表。每个事件可以有许多评级。我需要能够通过评分从数据库中提取前三名事件,但是当然,需要对评分进行平均,因此具有五颗星评分的事件的评分不会比具有四颗平均值和100评分的事件更高。 谁能指导我如何在SQL中创建它? 谢谢 更新谢谢大家,我想我应该对事情的加权方式更加清楚(尽管我认为我需要更多地思考我希望它如何工作)。提供的SQL虽然有很大的帮助 问题答案: 对列

  • 我如何将与此等价的东西传递给scikit-learn分类器,如随机森林或SVM分类器?

  • 假设我得到的是范围内的随机数,使用: 假设它给出的数字小于或等于25,你就赢了,如果它给出的数字大于25,我就赢了。然后我有75%的机会赢。 我该如何加权这个数字大于25的概率的某个百分比,比如说1%。 所以,基本上,我试图将我获胜的几率再提高1%,而不是仅仅说“你赢24分或更少” 如果不清楚,请告诉我。

  • 我目前已经部署了一个swagger项目,但是我在添加一些基本的授权时遇到了麻烦。当你点击“试试看!”按钮,您需要登录帐户才能访问结果。我有一个帐户,我想在每次有人试图访问api时自动使用它。贝娄是我这个项目的index.html: 我正在尝试确定信息应该去往何处,以允许基本授权。我知道它涉及到下面几行代码,但是有人能向我解释得更详细一点吗?我意识到GitHub上的swagger文档不是很清晰或者很

  • 问题内容: 有没有办法使用numpy.percentile函数来计算加权百分位数?还是有人知道替代的python函数来计算加权百分位数? 谢谢! 问题答案: 不幸的是,numpy并没有为所有功能内置加权函数,但是,您始终可以将某些东西放在一起。