使用预处理在数组中以O(1)时间进行范围中值查询

时间:2018-06-24 23:39:42

标签: algorithm data-structures range time-complexity median

在课堂上,我们了解了RMQ到LCA到RMQ的问题,以及如何支持O(1)时间内的操作范围最小查询。作为练习,我的教授分配了我来支持该操作:O(n)空间中的范围中值查询,O(n)预处理时间和O(1)选择时间。

比方说,我有一个包含8、7、9、2、6、4、5、3的数组A。在给出中位数(i,j)的情况下,我们应在第i个元素和第j个元素(包括)之间获得中值对数组进行排序。排序为2、3、4、5、6、7、8、9。例如,中位数(2,6)= A [4] = 6(因为中位数4、5、6、7、8为6)

我发现了其他建议使用段树的解决方案,但是在这些情况下复杂度不是O(1)。是否有可能以解决从RMA到LCA到RMQ的类似方式解决此问题?

2 个答案:

答案 0 :(得分:0)

比较无法做到。如果是这样,则可以通过预处理输入并计算从0到N-1的每个i的中值(i,i),比较O(N)时间中的N个元素。

答案 1 :(得分:0)

一种选择是使用非比较排序算法。我知道的示例是radix sortO(wn),其中w是单词大小)和counting sortO(n+k),其中k是最大值核心价值)。两者相对于输入大小都是线性的。

然后,您可以在列表中查找正确的位置,这是一个O(1)操作。两种排序方法都在您的空间要求之内-基数排序为O(n+k),计数排序为O(k)