【问题标题】:Is there a balanced BST with each node maintain the subtree size?是否存在平衡的 BST,每个节点都保持子树大小?
【发布时间】:2019-02-28 17:13:03
【问题描述】:

是否有一个balanced BST 结构也可以跟踪每个节点中的子树大小?

Java 中,TreeMap 是一棵红黑树,但不提供每个节点的子树大小。

以前,我确实写过一些可以跟踪每个节点的子树大小的 BST,但它并不平衡。

问题是:

  • 是否可以实现这样的树,同时保持的效率(O(lg(n)) 用于基本操作)
  • 如果是,那么是否有任何第三方库提供这样的实现?
    Java impl 很棒,但其他语言 (例如 cgo 也会有所帮助。

顺便说一句:

  • 应在每个节点中跟踪子树的大小。
    这样就可以在不遍历子树的情况下获得大小。

可能的应用:

  • 跟踪项目的排名,其值(排名所依赖的)可能会即时更改。

【问题讨论】:

    标签: algorithm data-structures tree binary-search-tree


    【解决方案1】:

    Weight Balanced Tree(也称为亚当斯树或有界平衡树)在每个节点中保持子树的大小。

    这也使得在 log(n) 时间内从开始或结束找到第 N 个元素成为可能。

    我的implementation in Nim is on github。它具有以下属性:

    • 通用(参数化)键、值映射
    • 在 O(log(N)) 时间内插入(添加)、查找(获取)和删除(删除)
    • 键序迭代器(inorder 和 revorder)
    • 在 O(log(N)) 时间内按从开始或结束 (getNth) 的相对位置查找
    • 在 O(log(N)) 时间内按键获取位置(排名)
    • 使用树键的高效集合操作
    • 映射扩展以使用可选的重复值合并控制来设置操作

    Scheme 和 Haskell 中也有可用的实现。

    【讨论】:

    • 这是否也允许重复值?我的意思是我们可以在每个节点上存储多重性吗?
    • 树中每个唯一键只有一个实例,但您可以选择将每个键的值实现为列表或设置为获取多个值。
    【解决方案2】:

    这就是所谓的“订单统计树”:https://en.wikipedia.org/wiki/Order_statistic_tree

    将大小添加到任何类型的平衡二叉树(红黑、avl、b-tree 等)非常容易,或者您可以使用直接处理大小的平衡算法,例如权重平衡树(@DougCurrie 答案)或(更好的)大小平衡树:https://cs.wmich.edu/gupta/teaching/cs4310/lectureNotes_cs4310/Size%20Balanced%20Tree%20-%20PEGWiki%20sourceMayNotBeFullyAuthentic%20but%20description%20ok.pdf

    不幸的是,我不认为有任何标准库实现,但如果你寻找它,你可以找到开源。你可能想自己动手。

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多