高效处理 "update elements" & "get min value among all element" 查询
Processing "update elements" & "get min value among all element" queries efficiently
问题
给你一个数组a = [a<sub>0</sub>, a<sub>1</sub>, ..., a<sub>n-1</sub>]
,处理这些Q
个查询。查询有以下两种类型:
- 给定两个整数
i
和 x
,将 a<sub>i</sub>
更新为 x
- 找出数组中所有元素的最小值
我已经知道带线段树的算法(范围最小查询),时间复杂度O(n log n)
。但是这种方式也可以计算出任何部分中的最小值,所以我认为有更简单和性能更好的方式可以处理这两种类型的查询。
还有其他办法解决吗?
使用数组和最小堆,并引用数组中的堆。
数组按索引包含元素(它基本上是您拥有的实际数组)并且堆按值排序,因此最小值始终在最前面。您将每个数组元素的引用(指针)添加到堆中相应的节点,以便您可以在那里轻松找到它。
要执行第一个查询,您访问索引 i
处的数组并将元素值设置为 x
(在索引验证等之后)。然后更新 a<sub>i</sub>
指向的堆中的节点并堆化。这花费 O(log n).
要执行第二个查询,只需从堆中获取最小值。 O(1).
问题
给你一个数组a = [a<sub>0</sub>, a<sub>1</sub>, ..., a<sub>n-1</sub>]
,处理这些Q
个查询。查询有以下两种类型:
- 给定两个整数
i
和x
,将a<sub>i</sub>
更新为x
- 找出数组中所有元素的最小值
我已经知道带线段树的算法(范围最小查询),时间复杂度O(n log n)
。但是这种方式也可以计算出任何部分中的最小值,所以我认为有更简单和性能更好的方式可以处理这两种类型的查询。
还有其他办法解决吗?
使用数组和最小堆,并引用数组中的堆。
数组按索引包含元素(它基本上是您拥有的实际数组)并且堆按值排序,因此最小值始终在最前面。您将每个数组元素的引用(指针)添加到堆中相应的节点,以便您可以在那里轻松找到它。
要执行第一个查询,您访问索引 i
处的数组并将元素值设置为 x
(在索引验证等之后)。然后更新 a<sub>i</sub>
指向的堆中的节点并堆化。这花费 O(log n).
要执行第二个查询,只需从堆中获取最小值。 O(1).