用 Fenwick 树计算子数组和

问题描述

我遇到了一个问题,不知道能不能用 Fenwick 树解决。 这是问题所在: 我有一个原始数组 a = [8,4,7,0]。现在我遍历数组,在每一步我都对排序的子数组感兴趣,它们看起来像这样:[8],[4,8],[0,8]。在我插入当前数字的迭代的每一步中,我想知道比我刚刚插入的数字大的所有数字的总和。所以对于上面的例子,它看起来像这样:

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

上面的例子只是为了说明,原始数组可以更大,因此有效地计算这些总和变得非常重要。关于如何有效解决此问题的任何建议?

解决方法

假设你离线知道数组,你可以通过排序找到每个元素的排名,例如,[8,4,7,0] --> [(8,3),(4,1),(7,2),(0,0)]。然后用全零初始化一个Fenwick树,并处理一个元素,将Fenwick树的后缀与更高等级对应的后缀相加,然后在其等级处插入元素。 Fenwick树的进化是

[0,0]
          --: sum = 0

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

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...