Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 用Fenwick树计算子数组和_Sorting_Data Structures_Segment Tree_Fenwick Tree_Array Sum - Fatal编程技术网

Sorting 用Fenwick树计算子数组和

Sorting 用Fenwick树计算子数组和,sorting,data-structures,segment-tree,fenwick-tree,array-sum,Sorting,Data Structures,Segment Tree,Fenwick Tree,Array Sum,我有一个问题,我不知道我是否能用一棵芬威克树来解决它。 问题是: 我有一个原始数组a=[8,4,7,0]。现在我遍历数组,在每一步我都对排序的子数组感兴趣,它看起来像:[8],[4,8],[4,7,8],[0,4,7,8]。在迭代的每一步,当我插入当前的数字时,我想知道比我刚才插入的数字大的所有数字的总和。因此,对于上面的示例,它将如下所示: [8] );sum=0,因为大于插入数字(8)的所有数字之和为0 [4,8];sum=8,因为大于插入数字(4)的所有数字之和为8 [4,7,8];su

我有一个问题,我不知道我是否能用一棵芬威克树来解决它。 问题是: 我有一个原始数组a=[8,4,7,0]。现在我遍历数组,在每一步我都对排序的子数组感兴趣,它看起来像:[8],[4,8],[4,7,8],[0,4,7,8]。在迭代的每一步,当我插入当前的数字时,我想知道比我刚才插入的数字大的所有数字的总和。因此,对于上面的示例,它将如下所示:

  • [8] );sum=0,因为大于插入数字(8)的所有数字之和为0
  • [4,8];sum=8,因为大于插入数字(4)的所有数字之和为8
  • [4,7,8];sum=8,因为大于插入数字(7)的所有数字之和为8
  • [0,4,7,8];sum=19,因为大于插入数字(0)的所有数字之和为19

上面的示例仅用于说明,原始数组可以大得多,因此高效地计算此类和变得非常重要。有没有关于如何有效解决此问题的建议?

假设您离线了解数组,您可以排序以查找每个元素的秩,例如,
[8,4,7,0]-->[(8,3)、(4,1)、(7,2)、(0,0)]
。然后用全零初始化一棵Fenwick树,要处理一个元素,将对应于更高秩的Fenwick树的后缀相加,然后在其秩处插入元素。芬威克树的进化是

[0, 0, 0, 0]
          --: sum = 0

[0, 0, 0, 8]
    --------: sum = 8

[0, 4, 0, 8]
       -----: sum = 8

[0, 4, 7, 8]
 -----------: sum = 19

如果您需要在线运行,那么我认为扩充平衡二叉搜索树是最简单的。

非常感谢!