代码之家  ›  专栏  ›  技术社区  ›  Eric

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

  •  0
  • Eric  · 技术社区  · 7 年前

    有没有 balanced BST 还跟踪每个节点中子树大小的结构?

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

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

    问题是:

    • 有没有可能实现这样一个树,同时保持 ( O(lg(n)) (用于基本操作) ?
    • 如果是,那么是否有任何第三方库提供这样的impl?
      A. JAVA impl很棒,但是其他语言 (例如 c , go ) 也会有帮助。

    顺便说一句:

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

    可能的应用:

    • 记录物品的等级,它们的价值 (排名取决于) 可能会随时改变。
    0 回复  |  直到 7 年前
        1
  •  1
  •   Doug Currie    7 年前

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

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

    我的 implementation in Nim is on github .它具有以下特性:

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

    Scheme和Haskell中也有实现。

        2
  •  1
  •   Matt Timmermans    7 年前

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

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

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