Algorithm 是否有平衡的BST,每个节点保持子树大小?

Algorithm 是否有平衡的BST,每个节点保持子树大小?,algorithm,data-structures,tree,binary-search-tree,Algorithm,Data Structures,Tree,Binary Search Tree,是否有一个平衡的BST结构也跟踪每个节点中的子树大小 在Java中,TreeMap是一棵红黑树,但不提供每个节点的子树大小 以前,我确实编写了一些BST,可以跟踪每个节点的子树大小,但它并不平衡 问题是: 在基本操作保持(O(lg(n))效率的同时,是否可以实现这样一个树 如果是,那么是否有任何第三方库提供此类impl? 一个Javaimpl很好,但是其他语言(例如c,go)也会有帮助 顺便说一句: 子树大小应在每个节点中保持跟踪。 这样就可以在不遍历子树的情况下获得大小 可能的应用:

是否有一个平衡的BST结构也跟踪每个节点中的子树大小

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

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

问题是:

  • 在基本操作保持(
    O(lg(n))
    效率的同时,是否可以实现这样一个树
  • 如果是,那么是否有任何第三方库提供此类impl?
    一个
    Java
    impl很好,但是其他语言(例如
    c
    go
    )也会有帮助
顺便说一句:

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

  • 跟踪项目的排名,其值(排名取决于)可能会动态变化
    • 树(也称为Adams树或有界平衡树)在每个节点中保持子树大小

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

      我的。它具有以下特性:

      • 通用(参数化)键,值映射
      • 在O(log(N))时间内插入(add)、查找(get)和删除(del)
      • 键顺序迭代器(inorder和revorder)
      • 按O(log(N))时间内从开始或结束(getNth)的相对位置进行查找
      • 按O(log(N))时间键获取位置(秩)
      • 使用树键的高效集合操作
      • 映射扩展以设置具有可选值合并控件的操作,用于重复项
      Scheme和Haskell中也有可用的实现。

      称为“订单统计树”:

      将大小添加到任何类型的平衡二叉树(红黑、avl、b-树等)都非常容易,或者您可以使用直接处理大小的平衡算法,如权重平衡树(@DougCurrie answer)或(更好的)大小平衡树:


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

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