范围和支持动态添加数据

时间:2013-11-04 19:54:47

标签: algorithm data-structures tree range

我正在寻找一种数据结构,它可以像Segment树那样进行范围总和,但可以支持随时添加新的数据,而无需重建整个树。我相信我可以将一个可以处理动态添加新数据的片段组合在一起,但它不会很漂亮。

如果有帮助,我将永远“追加”数据,因为它是基于时间的。

示例:

Order[time=0, quantity=1]
Order[time=1, quantity=2]
Order[time=2, quantity=4]
Order[time=3, quantity=2]

范围总和段树:

                sum[0->3=9]
    sum[0->1=3]             sum[2->3=6]
time0=1     time1=2     time2=4     time3=2

如果添加Order[time=4, quantity=3]

,上面的树会发生什么
                                        sum[0->4=12]
               sum[0->3=9]                                        sum[4->4=3]
    sum[0->1=3]           sum[2->3=6]                  sum[4->4=3]
time0=1     time1=2   time2=4     time3=2          time4=3

我当然可以使用上述方法,但我希望有更好的方法。

2 个答案:

答案 0 :(得分:1)

如果您始终在连续时间值附加数据,则可以考虑简单地将所有数量的累积总和存储在数组中。

1,2,4,2的例子会使数组为1,3,7,9:

1
1+2=3
1+2+4=7
1+2+4+2=9

然后,您可以通过减去累积数组的两个元素来对一系列元素进行求和。

这是附加的O(1)和范围和的O(1)。

答案 1 :(得分:1)

我不完全确定我理解你的问题,但听起来你正在寻找Fenwick tree。从数组中,可以在nlog(n)中构建Fenwick树,它们允许在log(n)中的连续范围内求和,并且可以在log(n)中更新节点。我不确定扩展阵列;我从来没有尝试过,但我希望它也会log(n)