在静态数组中计算最小查询量背后的逻辑是什么?

问题描述

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

最小查询:有一种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是2的幂,并且w =(b-a +1)/ 2

上面引用的部分是什么意思?为什么只计算某些长度的最小值?
想法和背后的直觉是什么?逻辑是做什么的?

某种预感与某种关于二叉树的事物有关,这是一种预感,因为我们在长度上仅考虑2的幂。

解决方法

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

如果每个具有2的幂的长度的每个子数组都具有mins(因此n log n内存),则可以通过取{{1 }}的2的最大幂,min(l-r) 开始,不会超过min,最大的2的最小幂以{ {1}} 不会低于l。这里的想法如下:

r 我们计算出RMQ的分钟数如下:

长度1:r

长度2:l

长度4:arr=[a,b,c,d,e,f,g,h]

要从1到6取最小值,我们希望长度4的最小值范围从1开始(因为8会超出我们的右索引),并取其最小值,长度4的最小值范围以6结尾。因此,我们从数组[min(a),min(b),min(c),etc]中获取这些查询,并取 [min(a,b),min(b,c),min(c,d),min(d,e),etc],这就是我们的答案。