【问题标题】:Which data structure/algorithm can find the smallest node on a path of a dynamic MST (or a rooted tree)哪种数据结构/算法可以找到动态 MST(或有根树)路径上的最小节点
【发布时间】:2015-03-13 14:47:04
【问题描述】:

在给定的 MST(或有根树)上,我们可以执行以下任务:

  1. 给以 x 为根的给定子树中的所有节点添加值 A。

    [Answered] Using Euclidean path, first and last appearance of x.
    
  2. 报告从 i 到 j 的路径上的最大值。

哪个数据结构/算法将花费最少的时间进行两个查询? 我不需要代码。我只想知道解决方案背后的想法。

【问题讨论】:

  • 我会将我的错误答案作为评论发布,因为它有助于第一部分:您可以结合使用欧拉之旅和线段树来有效地执行 (1)。但不确定(2)。
  • 感谢您的一半回答 :) 没有讽刺
  • 有趣的问题。 Euler 巡回树非常适合扩充整个子树,但不能做路径。链接/切割树可以增加路径,但不能做子树。我想知道是否有一个现有的数据结构可以两者兼得?
  • @templatetypedef 有两行(粗略)的修改来链接/切割树。

标签: algorithm data-structures tree


【解决方案1】:

我实现了一个通用的 Sleator--Tarjan 树,它可以提供对数时间和其他几个操作(http://www.davideisenstat.com/dtree/)。链接的实现是摊销的,但除了实际效率低下之外,没有理由不能完成最坏情况的版本。如果您考虑编写自己的,请与我交谈;那里有很多复杂性,对于您的用例来说可能是不必要的。

要在一个非常高的层次上描述这个想法,需要一个关于 S-T 树是如何组织的缩略图。我们将树植根于某处并将其分解为不相交的路径。每个路径都存储为一个展开树,其中每个数据结构节点存储其数据结构子树的最大值。 S--T 操作允许操作路径集合以包含查询路径(Expose 和 Evert 一端,然后 Expose 另一端)。展开树还允许将值添加到其所有节点(即整个路径)。与原始 S--T 论文相关的技巧是,当前公开的路径以外的路径可以从其父路径延迟更新,从而允许子树更新。

您也可以查看顶层树实现,但我个人认为顶层树接口很难推理,而且我知道的现有实现在实践中效率明显较低。

【讨论】:

  • 如何在 Sleator-Tarjan 树中使用新添加的权重更新子树?我不确定我知道该怎么做。
  • @templatetypedef 改变整个树就足够了,因为我们可以剪切和重新链接。诀窍是改变增量的传播方式。通常它们只传播给合法的孩子。在修改后的混凝土树中,它们也通过混蛋传播,因此整棵树都受到影响。这奇迹般地不会搞砸 delta max 字段。
猜你喜欢
  • 2020-04-07
  • 2017-05-28
  • 2012-07-25
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多