【问题标题】:RB tree with sum带总和的 RB 树
【发布时间】:2015-05-25 11:42:50
【问题描述】:

我有一些关于扩充数据结构的问题:


令 S = {k1, . . . , kn} 是一组数字。设计一个高效的 S 的数据结构,支持以下两种操作:

Insert(S, k) 插入 将 k 放入 S(您可以假设 k 尚未包含在 S 中),以及 TotalGreater(S, a) 它返回所有大于 a 的键 ki ∈ S 的总和,即 P ki∈S, ki>a ki

争论两个操作的运行时间并给出 TotalGreater(S, a) 的伪代码(不要给出 Insert(S, k) 的伪代码)。


我不明白该怎么做,我想在 RB 树中添加一个名为 sum 的额外字段,但它不起作用,因为有时我只需要左节点的总和,有时我也需要正确节点的总和。

所以我想添加 2 个字段,称为 leftSum 和 rightSum,如果当前节点是 > GivenValue,则将子节点总和的缓存值添加到当前总和值。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: algorithm data-structures tree red-black-tree


    【解决方案1】:

    您可以只为每个节点添加一个变量size,即以该节点为根的子树中的节点数。当找到具有大于值a 的最小值的节点时,到该节点的路径上可能会发生两件事:您可以向左或向右。每次向左走时,都会将右孩子的大小 + 1 添加到运行总数中。每次正确时,你什么都不做。

    终止有两个条件。 1)我们找到一个包含精确值a的节点,在这种情况下,我们将其右孩子的大小添加到总数中。 2)我们到达一个叶子,在这种情况下,如果它大于a,我们就加1,如果它更小,我们就加1。

    【讨论】:

      【解决方案2】:

      正如 Jordi 所描述的:关键字可以是增强的红黑树。

      【讨论】:

        猜你喜欢
        • 2012-12-16
        • 2012-06-13
        • 2021-05-30
        • 2010-12-08
        • 1970-01-01
        • 2015-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多