当数组是动态时,范围最小查询

时间:2016-09-08 15:47:26

标签: arrays algorithm segment-tree

我有一个数组说A(0索引)大小为1。

我想在索引k1(k1> = 0)和A.size() - 1(即最后一个元素)之间找到数组A中的最小值。

然后我会在数组的末尾插入值:(给定范围中的最小元素+一些“随机”常量)。然后我有另一个查询来查找索引k2和A.size() - 1之间的最小值。我发现,在最后插入值:(在给定范围内最小值+另一个“随机”常量)。我必须做很多这样的询问。

说,我有N个查询。天真的方法需要O(N ^ 2)。

不能使用段树,因为数组不是静态的。但是,一个聪明的方法是使段大小为N + 1阵列;事先用无穷大填充未知值。这会给我O(Nlog N)的复杂性。

是否存在NlogN复杂性甚至N?

的其他方法

1 个答案:

答案 0 :(得分:2)

这里绝对不需要使用树之类的高级数据结构。只需一个简单的局部变量和列表即可完成所有操作:

创建一个空列表(例如minList)。

end索引开始,直到最初给定的数组的start索引,放入最小值(直到end的索引)在列表的前面(即做push_front)。

让我们说提供的数组是:

70 10 50 40 60 90 20 30

因此结果minList将是:

10 10 20 20 20 20 20 30

执行此操作后,需要跟踪连续修改数组中新添加的元素中的最小值(例如,minElemAppended)。< / p>

假设您获得k = 5randomConstant = -10,那么

minElemAppended = minimum(minList[k-1] + randomConstant, minElemAppended)

采用这种方法,

  • 您不需要遍历附加部分甚至是初始给定数组。
  • 您可以选择不附加元素。
  • 时间复杂度:O(N)来处理N次查询。
  • 空间复杂度:O(N)用于存储minList