如何在树上的路径上回答查询?

时间:2017-07-14 13:46:55

标签: algorithm tree segment-tree

假设我有一个数组,我必须回答查询,比如找到从索引i到j的所有元素的总和,现在我可以在root树上执行此操作,就像回答从节点i到j的路径的此类查询一样(在从i到j)的唯一路径上。

我知道如何使用范围最小查询查找LCA,我们将其分解为线性数组,然后使用分段树,但我无法对求和进行修改。我该怎么做?

1 个答案:

答案 0 :(得分:0)

这取决于您的处理要求:您是否有复杂性限制,或者目标是在午餐时间之前使用可维护的代码?

如果是后者,请采取简单的方法:

  • 在树中找到两个节点。
  • 从第一个节点开始,遍历到根节点,随时对路径成本求和,保持每个节点的部分和。
  • 从第二个节点开始,也是朝向根的遍历和求和(仅完全求和,无部分)。
  • 当您遇到第一个节点的祖先节点时,您就找到了LCA。
  • 将当前总和添加到第一个节点的LCA部分和。完成。

第一学期的数据结构学生很容易理解这个算法。通过对LCA的一致性检查,它的 O (log(n)^ 2) - 不错,但不是LCA的线性预工作和恒定时间查询返回的最佳值。

如果您需要更快的算法,那么我建议您扩充LCA预处理算法,以便每个节点还计算其每个祖先的部分和的散列列表(例如Python字典)。完成后,您可以对LCA进行恒定时间计算,并对每个部分和进行恒定时间查找。