在课堂上,我们了解了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的类似方式解决此问题?
答案 0 :(得分:0)
比较无法做到。如果是这样,则可以通过预处理输入并计算从0到N-1的每个i的中值(i,i),比较O(N)时间中的N个元素。
答案 1 :(得分:0)
一种选择是使用非比较排序算法。我知道的示例是radix sort(O(wn)
,其中w
是单词大小)和counting sort(O(n+k)
,其中k
是最大值核心价值)。两者相对于输入大小都是线性的。
然后,您可以在列表中查找正确的位置,这是一个O(1)
操作。两种排序方法都在您的空间要求之内-基数排序为O(n+k)
,计数排序为O(k)
。