1

我正在阅读有关静态数组查询的信息,这就是我发现的:

最小查询:有一个 O(nlogn) 时间预处理方法,之后我们可以在 O(1) 时间内回答任何最小查询。

这个想法是预先计算 min(a, b) 的所有值,其中 b - a + 1(范围的长度)是 2 的幂。预先计算的值的数量是 O(nlogn),因为有 O(logn) 范围长度是 2 的幂。

可以使用递归公式有效地计算这些值:
min(a,b) = min(min(a, a + w - 1), min(a + w, b))
其中 b-a+1 是二和 w = (b - a + 1) / 2

上面引用的部分是什么意思?为什么我们只计算特定长度的最小值?
它背后的想法和直觉是什么?逻辑有什么作用?

有一种预感,它一定与二叉树有关,因为我们只考虑长度的 2 的幂。

4

1 回答 1

1

这种结构称为 RMQ,即范围最小查询。O(1)它通过利用min操作的关联性和交换性(即min(x,y)=min(y,x)min(x,y,z)= min(x,min(y,z))来实现查询。另一个属性minmin(x,x) = x,更重要的是,min(x,y,z)=min(min(x,y),min(y,z))

如果您拥有mins2 的每个幂的每个长度子数组的所有子数组(因此是n log n内存),则可以min(l-r)通过取min2 的最大幂来计算范围,从 开始l,不会过冲r,最小值为以 2结尾的r最大幂不会下冲l。这里的思路如下:

arr=[a,b,c,d,e,f,g,h] 我们计算 RMQ 的分钟数如下:

长度为 1:[min(a), min(b), min(c), etc]

长度为 2:[min(a,b), min(b,c), min(c,d), min(d,e), etc]

长度为 4:[min(a,b,c,d}, min(b,c,d,e), min(c,d,e,f), etc]

要从 1 到 6 取最小值,我们希望长度为 4 的最小值范围从 1 开始(因为 8 会超过我们的右索引)并取最小值,长度为 4 的最小值范围以 6 结尾。所以我们取这些来自数组的查询of length 4,并取最小值, min(of length 4[1], of length 4[2])这就是我们的答案。

于 2020-08-14T16:02:14.027 回答