问题描述
我正在阅读有关静态数组查询的信息,这是我发现的:
最小查询:有一种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]
,这就是我们的答案。