从具有N个节点的树中选择K个节点,成本最低

时间:2012-10-12 19:07:36

标签: algorithm

有一棵树有N个节点和N-1个边缘(使它成为一棵树)。每个节点具有权重W(i)。如何选择仍包含原始树根的K个节点的子树?我必须这样做,以便最小化选择这个“子树”的“成本”,其中成本被定义为所有边缘的权重之和。

我想我以前做过这样的问题,看起来像DP /递归。但是,当每个节点限制为2个孩子时,我知道如何处理它。您定义了一个函数成本(n,i),这意味着保持i节点从节点n开始的最低成本。你会在其中一个孩子中从i = 0迭代到n,然后将剩下的孩子交给另一个孩子。但是,由于每个节点可以拥有无​​限量的子节点,有没有办法解决这个问题?

由于

2 个答案:

答案 0 :(得分:2)

对于给定节点,您希望使用其子项的成本(n,i)计算成本(n,i)。从0..K为孩子编号,你有另一个动态程序。在阶段j,你想要仅使用儿童0..j来计算出最好的成本(n,i)。

我一直在考虑使用机器学习来编写类似的东西(只是为了好玩,我想通过拟合两个Weka分类器而不是一个来编写寻找异常的程序)。那有什么像你的目的吗?

答案 1 :(得分:0)

DP解决方案(可能与mcdowella描述的相似或不同):

让根节点编号为0.其余节点可以任意编号(但最好的方法是逐个对节点进行编号)。

f(i, j)表示当我们考虑索引大于i的所有兄弟节点加上任何子节点(如果适用)时的最小成本,并且我们从有效节点中选择j个节点。

f(i, 0) = 0            // i can be anything, even NOT_FOUND
f(NOT_FOUND, j) = +Inf // j > 0
f(i, j) = min(f(x, j), // Node i not chosen
              min[r = 0 to j - 1] (f(x, j - 1 - r) + f(y, r)) + cost(i))
              // Node i is chosen, then we can pick some elements from 
              // children node, or from untouched sibling nodes + descendants

,其中

  • x是大于i的最小索引,而节点xi是兄弟节点
  • y是最小的索引,其中节点y是节点i的子节点。
  • 如果找不到索引,则会将NOT_FOUND分配给xy

结果将在f(0, K)