Algorithm 支持动态添加数据的范围和

Algorithm 支持动态添加数据的范围和,algorithm,data-structures,tree,range,Algorithm,Data Structures,Tree,Range,我正在寻找一种数据结构,它可以像段树一样进行范围求和,但可以支持在任何时候添加新的数据段,而无需重建整个树。我相信我可以拼凑出一个可以动态添加新数据的片段,但这并不漂亮 如果有帮助,我将始终“附加”数据,因为它是基于时间的 例如: Order[time=0, quantity=1] Order[time=1, quantity=2] Order[time=2, quantity=4] Order[time=3, quantity=2] 范围和段树: sum[0-

我正在寻找一种数据结构,它可以像段树一样进行范围求和,但可以支持在任何时候添加新的数据段,而无需重建整个树。我相信我可以拼凑出一个可以动态添加新数据的片段,但这并不漂亮

如果有帮助,我将始终“附加”数据,因为它是基于时间的

例如:

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

<>我当然可以使用上面的方法,但是我希望有更好的东西。

如果你总是在连续的时间值上附加数据,你可以考虑简单地把所有数量的累积和存储在一个数组中。 您的示例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)表示范围和。

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

是的,我也在看一棵Fenwick树,但当我想“调整”底层数组的大小时,它看起来就不那么吸引人了。这仍然是一个选项。@Justin如果听起来有帮助,并且能够在
log^2(n)
中扩展数组一个索引时间足够快,我可以尝试编写算法。我认为那将是最糟糕的时刻。如果你能更详细地解释这个问题,我也许能帮上更多的忙——我对分段树不是很熟悉。如果你有时间写下来,我会有兴趣看看算法。有趣而简单,我上面的例子比我的实际用例简单一点。让我看看我是否可以将同样的想法应用到我的数据中。@Justin更新(与附录相反)在这种模式下会非常昂贵(
O(n)
),但如果您不希望有很多这样的更新,它可能是一个很好的选择。以前的数据不会有更新;所以这不是一个问题。@Justin在这种情况下,这将比Fenwick trees更适合您-它们的优势是更新速度快,并且它们放弃了一点抓取速度来实现这一点。