存储部分和的二叉树:名称和现有实现

时间:2010-09-29 13:59:13

标签: c++ data-structures binary-tree montecarlo

考虑一系列 n 正实数,( a i )及其部分和序列,( s <子> I 的)。给定一个数字 x ε(0, s n ],我们必须找到 i ,这样小号 <子> I -1 &LT; X 取值<子> I 的。此外,我们希望能够更改其中一个 a i ,而无需更新所有部分和。两者都可以在O中完成(log n < / em>)通过使用带有 a i 的二叉树作为叶节点值的时间,并且非叶节点的值是值的总和如果 n 已知并且已修复,则树不必是自平衡的,并且可以有效地存储在线性阵列中。此外,如果 n 是2的幂,只有2 n - 需要1个数组元素。参见Blue等,Phys.Rev。E 51 (1995),pp.R867 -R868用于应用程序。鉴于问题的通用性和解决方案的简单性,我想知道这个数据结构是否具有特定名称以及是否存在实现(最好用C ++)。我自己已经实现了它,但是从头开始编写数据结构似乎总是让我重新发明轮子 - 如果以前没有人这样做我会感到惊讶。

2 个答案:

答案 0 :(得分:4)

Fenwick tree(又名二进制索引树)是一种维护一系列元素的数据结构,能够计算O(logn)时间内任何范围的连续元素的累积和。更改任何单个元素的值也需要O(logn)时间。

答案 1 :(得分:4)

这在函数式编程中被称为finger tree,但显然在命令式语言中有实现。在文章中有一个blog post链接,用于解释C#中此数据结构的实现,这对您有用。