【问题标题】:maximum independent set weight最大独立设定重量
【发布时间】:2015-05-23 11:59:39
【问题描述】:

我正在尝试解决之前提出的问题中概述的问题:

Finding size of max independent set in binary tree - why faulty "solution" doesn't work?

给定一个包含 n 个整数的数组 A,其索引从 0 开始(即 A[0]、A[1]、...、A[n-1])。我们可以将 A 解释为一棵二叉树,其中 A[i] 的两个孩子分别是 A[2i+1] 和 A[2i+2],每个元素的值就是树的节点权重。在这棵树中,如果一组顶点不包含任何父子对,我们就说它是“独立的”。独立集的权重只是其元素所有权重的总和。开发一种算法来计算任何独立集的最大权重。

但是,我正在尝试用 Java 解决这个问题。我已经查看了链接问题中的 python 解决方案,但这行对我来说没有意义:

with_root = sum(map(find_max_independent, grandkids))+ max(true_root[root_i],0)

是否有与此解决方案等效的 Java?

【问题讨论】:

  • 还在寻找java解决方案

标签: java python algorithm


【解决方案1】:

当然有一个 Java 等价物。尽管可能取决于您对“等效”的含义。我对当前的 Java 不是很流利,所以我会为你理解那句话。

sum(map(find_max_independent, grandkids))部分表示:

find_max_independent(grandkids[0]) + find_max_independent(grandkids[1]) + ...

如果max(true_root[root_i], 0) 不是负数,则它只是当前节点的权重,否则为零(注意权重只是已知为“整数”,因此它们可能为负数)。虽然,这确实没有必要检查,因为使用零意味着不包括节点,这已经被 without_root 覆盖了。

该算法是 btw not O(n) 正如所声称的那样,我已经在那里写了评论。这实际上是一个,而且也更简单:

def max_independant_weight(weights):
    def with_and_without(i):
        if i >= len(weights):
            return 0, 0
        left  = with_and_without(2*i + 1)
        right = with_and_without(2*i + 2)
        return (weights[i] + left[1] + right[1],
                max(left) + max(right))
    return max(with_and_without(0))

【讨论】:

  • 感谢您的回复。但是我认为上面的代码中仍然有一点python :P “def”行是做什么的?此外,这适用于任何重量的节点吗?
  • 另外,Java 不能返回多个值,那么如果它只允许返回一个值,你将如何做到这一点?
【解决方案2】:

Stefan 是对的,我的解决方案不起作用。所以我把他翻译成Java。我制作了静态方法,但您可以随意使用它。

  public static void main(String[] args)
  {
    int[] tree = new int[] { 3, 2, 2 };

    System.out.println(max_independant_weight(tree));
  }

  private static int max(int[] array)
  {
    int max = Integer.MIN_VALUE;

    for (int i : array)
    {
      if (i > max)
      {
        max = i;
      }
    }

    return max;
  }

  private static int max_independant_weight(int[] weights)
  {
    return max(with_and_without(weights, 0));
  }

  private static int[] with_and_without(int[] weights, int i)
  {
    if (i >= weights.length)
    {
      return new int[] { 0, 0 };
    }
    int[] left = with_and_without(weights, (2 * i) + 1);
    int[] right = with_and_without(weights, (2 * i) + 2);
    return new int[] { weights[i] + left[1] + right[1], max(left) + max(right) };
  }

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 2021-03-13
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2013-11-17
    • 2021-12-25
    相关资源
    最近更新 更多