支持Add和Partial-Sum的数据结构

时间:2011-04-19 05:42:50

标签: algorithm data-structures big-o

  

设A [1..n]是实数的数组。设计算法以执行以下操作的任何顺序:

Add(i,y) -- Add the value y to the ith number.
Partial-sum(i) -- Return the sum of the first i numbers, i.e.
     

没有插入或删除;唯一的变化是数字的值。每个操作都应采取O(logn)步骤。您可以使用另一个大小为n的数组作为工作空间。

如何设计上述算法的数据结构?

2 个答案:

答案 0 :(得分:6)

用n个叶子构造一个平衡的二叉树;以原始顺序粘贴树底部的元素。

用“子树叶子总和”增加树中的每个节点;一棵树有#leaves-1个节点,所以这需要O(n)的设置时间(我们有)。

查询部分和是这样的:向查询(叶)节点下降树,但每当你向右下行时,在左边添加子树和加上刚刚访问过的元素,因为这些元素在总和。

修改值如下:查找查询(左)节点。计算您添加的差异。前往树的根部;当您前往根目录时,通过添加差异来更新您访问的每个节点(您可能需要访问相邻节点,具体取决于您是否存储“子树叶子总和”或“左子树加上我自己”或一些变种);主要思想是适当更新所有需要更新的扩充分支数据,并且数据将位于根路径上或与其相邻。

这两个操作占用O(log(n))时间(即树的高度),并且在每个节点上执行O(1)工作。

您可以使用任何搜索树(例如,自平衡二进制搜索树可能允许插入,其他搜索树可以更快地访问)但我没有想到通过。

答案 1 :(得分:2)