我必须对一个数组执行一系列范围更新,即在一个范围内添加或减去一些常量。之后我必须找到最终数组的RANGE,即(max-min)。最初的数字是1到n。
我正在使用二进制索引树。每次更新都在log N中。我想知道是否有办法在O(n)或更短的时间内找到RANGE(或max和min)。通常,它需要O(n log n)。
答案 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树,尽管空间更大。