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