Algorithm 平衡分支算法

Algorithm 平衡分支算法,algorithm,sorting,graph,tree,binary-tree,Algorithm,Sorting,Graph,Tree,Binary Tree,所以我在做一个学校的任务,看起来像这样 我完全不知道从哪里开始。有人能给我指出正确的方向吗 我的出发点是首先计算根节点的差异值(给定叶值总和的绝对值),然后(以某种方式)检查是否存在高于根值的差异值,如果不存在,则根值是输入的最小可能差异。我走对了吗?目前,我似乎无法取得任何比这更进一步 重要提示:构建的树必须“尊重”给定的顺序 价值观。例如,如果输入是(5,0,0,-5),则不是 允许通过首先组合第一个和最后一个来构建树 将项目放入树中。更正式地说:在每个内部节点上,输入 在该节点的左子树中

所以我在做一个学校的任务,看起来像这样

我完全不知道从哪里开始。有人能给我指出正确的方向吗

我的出发点是首先计算根节点的差异值(给定叶值总和的绝对值),然后(以某种方式)检查是否存在高于根值的差异值,如果不存在,则根值是输入的最小可能差异。我走对了吗?目前,我似乎无法取得任何比这更进一步

重要提示:构建的树必须“尊重”给定的顺序 价值观。例如,如果输入是(5,0,0,-5),则不是 允许通过首先组合第一个和最后一个来构建树 将项目放入树中。更正式地说:在每个内部节点上,输入 在该节点的左子树中显示为叶子的值必须全部 位于右子树中显示为叶子的输入值之前


谢谢

首先,请注意这是一个方便的递归问题:无论何时组合相邻节点,都会将问题减少一个节点。问题状态可以完全表示为值列表和最大值;您给定的问题可以发送到解决方案函数中,如下所示

a = [-1, -5, 4, -2]
balance(a, max(max(a), abs(min(a))))
简单地说

balance(a, 5)
此问题的右手解决方案将进展如下:

[-1, -5, 4, -2], 5
[-1, -1, -2], 5    * see note below
[-1, -3], 5
[-4], 5
  • 从这里开始,连接是无关紧要的,因为没有可能超过原始差异5的剩余路径

我建议一种半贪婪的方法:目标是从最大节点向外工作,避免使它变得更糟,或者使损害最小化。 找到最大节点。还要总结顺序:我们不需要浪费任何时间试图避免不可避免的总结。例如,给定

-5 1 1 -5 1 1 -5 1
我们不需要因为降到-5以下而尖叫:总数是-10,所以我们无法避免如此高的差异。这可能是以后的微调考虑事项


首先,观察最大节点的两侧;将每个节点视为从该节点旁边开始的子列表。搜索其和为相反符号的子序列;如果找到了,将其折叠(将该序列作为子问题),然后将其合并到问题节点

例如:

4 -5 1 1 2 -1 -1 -6 -2 -1 2 -3 2 2
差异为
6
,靠近中间。将该点处的序列划分为两个递减子序列及其运行和:

seq: -1 -1 2 1 1 -5 4
sum: -1 -2 0 1 ...

seq: -2 -1  2 -3  2 2
sum: -3 -3 -1 -4 -2 0
左侧(按照
-6
元素的顺序相反)在第四个元素达到一个平衡和(相反的符号,因此合并它们将减少差异):
-1-12 1
是具有正和的最短子序列。在
[1 2-1-1],6上作为子问题(要考虑的子树)重复出现。这将返回一个子树,如
((1(2-1))-1)
,其值为
1
。值列表现在为:

4 -5 1 1 -6 -2 -1 2 -3 2 2
       ^ this is the sub-tree we just reduced.
现在我们在最大差异附近有一个平衡值;这表示下一个操作是合并这两个值:

4 -5 1  -5  -2 -1 2 -3 2 2
从这里继续。请注意,在某些情况下,回归到
6
值的自由度可以加快解决方案搜索

我们将把它分解成碎片继续下去

-1 -4     -2 -1 2 -3 2 2
这将从右边开始,逐渐减少

-1 -4     -2 -1 2 -3 2 2
-1 -4     -2 -1 2  -1  2
-1 -4     -2   1   -1  2
-1 -4       -1     -1  2
-1 -4       -1        1
-1 -4             0
在这里,我们终于爬回了完整列表中最大的剩余值

-1 -4 0
-1 -4
-5

这足以让您移动吗?

对于给定的集合a[1]…a[n],每个集合对应一个叶节点,很明显,每个树的差异的下限为:

B(x[]) = max (abs(x[1]),...,abs(x[n]), abs(sum))
其中
sum
,所有
x[i]
的总和对应于从
x[i]
生成的每个树的根节点的权重

这里的目标只是表明,构建一棵树总是可能的,它的差异等于这个下限

它分两步实现

在第一步中,如果两个相邻的节点具有不同的符号,我们只需合并它们。这通过将这两个节点替换为新节点来实现,新节点的权重是两个权重的总和。此权重的绝对值小于两个输入权重绝对值的最大值,因此小于界限。我们重复这个过程,直到我们只得到节点(一个新的集合),它们的权重都有相同的符号

在第二步中,我们必须管理一个集合,从初始集合派生,其中所有权重都具有相同的符号。可以从中创建的所有树的最大节点对应于顶部节点,其权重等于当前活动节点的所有权重之和,其等于初始集的和。此总和对应于小于或等于下限的值

最后,我们得到一棵树,它的权值都小于或等于下限

例如:

-1 -5 4 -2      -> merge -5 and 4
-1 -1 -2        -> all signs equal, 2nd step: the maximum node of this sub-array correspond to the sum -4
有趣的是,我们通过以不同的顺序应用规则获得了相同的结果:

-1 -5 4 -2      -> merge 4 and -2
-1 -5 2         -> merge -5 and 2
-1 -3           -> all signs equal, 2nd step: sum equals -4

不幸的是,我误解了这个问题。不幸的是,我只理解你解释的50%。我开始在第二部分迷路了(当你说“左边在第四个元素达到一个平衡和。在[12-1-1],6作为一个子问题重复出现,然后将其与-6合并,给出”)。您如何准确定义“平衡金额”?“与-6合并”是什么意思?你是说“在子列表中追加-6”吗?另外,对递归部分有点困惑。“再次出现在…”是否意味着呼叫
balance(a,max(a),abs(min(a))
其中
a=[1,2,-1,-1,-6]
?这是很好的反馈!我试着猜测演讲的正确程度,但我猜得太高了。当我有时间的时候我会重写这个-,不太可能在接下来的12小时内,但是我们会看到,…+1与-6的符号相反,所以你可以把它们结合起来,把下一个节点的值从t中拉出来