我正在寻找一种数据结构,它可以像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
我当然可以使用上述方法,但我希望有更好的方法。
答案 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)
。