12得票1回答
使用树状数组实现区间增量

我在想能否修改树状数组(或者说二叉索引树)来: 1)将某一范围内所有元素的频率递增一定量 2)查询单个元素的频率。 这与传统的树状数组不同,传统的树状数组是在单个元素上进行更新,而在范围内进行查询(有点像一个反向的树状数组)。

23得票3回答
如何适应树状数组解决区间最小值查询问题

Fenwick树是一种数据结构,提供了一种有效的方式来回答主要查询: 向数组的特定索引添加元素 update(index, value) 找到从1到N的元素之和 find(n) 这两个操作都在O(log(n))时间内完成,我理解逻辑和实现。实现一堆其他操作(如查找从N到M的总和)并不难...

9得票4回答
如何从Fenwick树中高效地找到一段连续的已用/空闲槽位范围

假设我正在跟踪Fenwick树中插槽的使用情况。例如,考虑跟踪32个插槽,导致Fenwick树布局如下图所示,其中网格中的数字表示底层数组中的索引,该数组由Fenwick树操作,每个单元格中的值是该段中“已用”项的总和(即数组单元格23存储范围[16-23]中使用的插槽数量)。最低级别的项(即...

12得票3回答
需要明确解释范围更新和范围查询二进制索引树。

我已经学习了一些关于二叉索引树范围更新和范围查询的教程,但我完全无法理解它们。我不明白为什么需要建立另一棵树。 请有人用简单易懂的英语解释并提供一个示例吗?

10得票2回答
如何在树状数组或者Fenwick树中进行区间更新?

我正在尝试使用树状数组解决在UVA中的这个问题: Problem H Ahoy, Pirates! Input: Standard Input Output: Standard Output In the ancient pirate ages, the Pirate Land was...

12得票1回答
`(i & (i + 1)) - 1`在Fenwick树中是什么意思?

在学习树状数组时,我发现了这个实现: 源代码:https://algorithmist.com/wiki/Fenwick_treeclass Fenwick_Tree_Sum { vector<int> tree; Fenwick_Tree_Sum(const ve...

65得票3回答
在位编程中,(number & -number) 的含义是什么?

例如:int get(int i) { int res = 0; while (i) { res = (res + tree[i]) % MOD; i -= ( (i) & (-i) ); } return res; } ...

7得票1回答
O(lg N)时间复杂度下的逆序对数量范围查询

给定一个未排序的包含n个整数的数组,我知道可以使用BIT在O(N lg N)的时间复杂度内找到逆序对的总数,具体方法请参考Count Inversion by BIT。 但是,如果我需要查询任意范围内逆序对的总数,是否可能在O(lg N)的时间复杂度内完成? 可以接受O(N lg N)的预...

23得票6回答
在O(lg N)时间内查询一个范围内不同整数的数量,是否可能?

我已经阅读了一些关于两种常见数据结构的教程,它们可以在O(lg N)的时间内实现区间更新和查询:线段树和二叉索引树(BIT / Fenwick Tree)。 我找到的大多数示例都涉及到某些类似“范围内整数求和”、“范围内整数异或”等可交换和可结合运算。 我想知道这两个数据结构(或者任何其他数据...

34得票2回答
能否在O(n)时间内构建一棵Fenwick树?

树状数组是一种数据结构,它允许两种操作(可以增加更多操作): 点更新update(index, value) 前缀和query(index) 这两个操作的时间复杂度都为O(log(n)),其中n是数组的大小。我没有问题理解如何执行这两个操作以及它们背后的逻辑。 我的问题是如何从数...