Algorithm 如何用最小范围查询实现二进制搜索?

Algorithm 如何用最小范围查询实现二进制搜索?,algorithm,binary-search,rmq,Algorithm,Binary Search,Rmq,给定一个区间,比如A[i-j],我们可以使用RMQ轻松地找出区间A[i-j]之间的最小值。现在我正试图改变这个条件:——给定一个最小值,找出包含这个数字作为最小值的间隔(最大长度)。我试图用二进制搜索来实现这个功能,但没有成功。请帮我解释一下如何解决这个问题。谢谢 这里有一个简单的算法,可以计算线性时间内数组中每个元素左边最近的较小数。其思想是维护一堆对(元素、位置),并在元素不再有用时弹出这些元素。伪代码: stack = new Stack<Pair>() // an empty

给定一个区间,比如A[i-j],我们可以使用RMQ轻松地找出区间A[i-j]之间的最小值。现在我正试图改变这个条件:——给定一个最小值,找出包含这个数字作为最小值的间隔(最大长度)。我试图用二进制搜索来实现这个功能,但没有成功。请帮我解释一下如何解决这个问题。谢谢

这里有一个简单的算法,可以计算线性时间内数组中每个元素左边最近的较小数。其思想是维护一堆对(元素、位置),并在元素不再有用时弹出这些元素。伪代码:

stack = new Stack<Pair>() // an empty stack of pairs(element, position)
leftSmaller = new int[n] // an array to store the answer
fill(leftSmaller, -1) 
for (i = 0; i < n; i++) // n is the size of the given array
    while (!stack.isEmpty() and stack.top().first >= array[i]) // pop the elements from the stack while they are larger the current element
        stack.pop()
    if (!stack.isEmpty()) // if there is a smaller element 
        leftSmaller[i] = stack.top().second // its position is the answer for the current position
    stack.push(new Pair(array[i], i))
stack=new stack()//成对的空堆栈(元素、位置)
leftSmaller=newint[n]//存储答案的数组
填充(左较小,-1)
for(i=0;i=array[i])//当元素大于当前元素时,从堆栈中弹出元素
stack.pop()
if(!stack.isEmpty())//如果有较小的元素
leftSmaller[i]=stack.top()。第二个//它的位置是当前位置的答案
stack.push(新对(数组[i],i))
每个元素只被推送到堆栈一次,最多弹出一次。这就是为什么时间复杂度是
O(n)


它与您问题中所述的问题有何关系?您可以为阵列中的每个位置预计算左侧的第一个较小元素,右侧的第一个较小元素(通过在反向阵列上运行此算法)。位置
i
的答案是
rightsaller[i]-leftSmaller[i]-1
。在知道数组中每个位置的答案后,您可以轻松地解决原始问题(对于给定的最小值,只需在所有
i
中选择最佳答案,这样
array[i]=minimum
),

不只是为您编写代码,而是我解决该问题的方法是1)在数组中找到目标值,然后2)当值大于目标值时,将间隔向左扩展,3)将间隔向右扩展。。。二进制搜索不是解决这个问题的合适工具,因为它需要对数组进行排序才能工作(在这种情况下,查找间隔很简单),并且,当给定一个未排序的数组时,无法保证两点之间的值……“将您的间隔扩展到数组的左侧”。设数组为{5,4,3,2,1}。最小值为1。在这种情况下,如何有效地向左遍历,而不是将间隔延长1。