在线性或次线性时间内查找BIT的最大值和最小值

时间:2012-08-07 19:22:26

标签: algorithm data-structures bit

我必须对一个数组执行一系列范围更新,即在一个范围内添加或减去一些常量。之后我必须找到最终数组的RANGE,即(max-min)。最初的数字是1到n。

我正在使用二进制索引树。每次更新都在log N中。我想知道是否有办法在O(n)或更短的时间内找到RANGE(或max和min)。通常,它需要O(n log n)。

3 个答案:

答案 0 :(得分:0)

您需要对数组元素进行直接索引访问,因为您需要解决它们以进行增量更新。

您还需要维护最小堆和最大堆。

更新元素时​​,还需要更新两个堆中的相应条目。因此,您需要将指针存储到数组中两个堆中的相应元素中。

创建原始堆是O(n),任何修改都是O(lg(N))。

答案 1 :(得分:0)

为什么不对数组进行一次排序?然后从整个数组中加上或减去一个常数仍然给出相同的顺序,并乘以正数。也许还有更多的图片。

答案 2 :(得分:0)

这个问题已经快2年了,因此我不确定这个答案是否会有所帮助。无论如何... 我从未使用BIT来回答最小或最大查询。这里有范围查询,可以同时更改大量数字。因此最大值和最小值也会更新。据我所知,除了点查询,范围和搜索等以外,我从未见过用于查询的BIT。 通常,分段树为搜索最小值和最大值提供了更好的选择。执行所有更新后,您可以在O(lg n)时间内找到它们。但是,在更新期间,您必须更新每个节点的最小最大值,这可以使用Lazy Propagation完成。更新成本为O(lg n)。 总之,如果m lg n<对于您的应用程序,您可以使用Segment树,尽管空间更大。