Algorithm k个相邻元素的局部最小值的全局最大值

Algorithm k个相邻元素的局部最小值的全局最大值,algorithm,Algorithm,如果这个问题似乎是重复的,请指出它 问题是: 给定一个由n个元素组成的数组和一个整数k可以在O(n logk)时间内完成;我先给你小费 假设在某些数据结构中有元素ai+1,…,ai+k,这些元素具有对数时间插入和常量时间最小操作(如最小堆)。你能用它来获得相同的数据结构,但是元素ai+2,…,ai+k+1吗 在O(logk)时间内 一旦你有了它,你基本上就可以通过所有连续的k组,并通常取最小值中的最大值。这里有一种方法可以使用类似于动态规划的解决方案来解决它。我们构造了一个数组“ys”,用于存储

如果这个问题似乎是重复的,请指出它

问题是:

给定一个由n个元素组成的数组和一个整数k可以在O(n logk)时间内完成;我先给你小费

假设在某些数据结构中有元素ai+1,…,ai+k,这些元素具有对数时间插入和常量时间最小操作(如最小堆)。你能用它来获得相同的数据结构,但是元素ai+2,…,ai+k+1吗 在O(logk)时间内


一旦你有了它,你基本上就可以通过所有连续的
k
组,并通常取最小值中的最大值。

这里有一种方法可以使用类似于动态规划的解决方案来解决它。我们构造了一个数组“ys”,用于存储范围不断增加的分钟数。它使用的思想是,如果
ys
当前存储长度为p的范围的分钟数,那么如果我们对所有i进行存储:
ys[i]=min(ys[i],ys[i+p])
,那么我们现在得到长度为2p的范围的分钟数。类似地,如果我们做
ys[i]=min(ys[i],ys[i+p],xs[i+2p])
那么我们得到了长度为2p+1的范围的min。通过使用一种非常类似于平方求幂的技术,我们最终可以使用ys存储长度k的最小范围

def mins(xs, k, ys):
    if k == 1: return ys
    mins(xs, k // 2, ys)
    for i in xrange(len(ys)):
        if i + k//2 < len(ys): ys[i] = min(ys[i], ys[i+k//2])
        if k % 2:
            if i+k-1 < len(ys): ys[i] = min(ys[i], xs[i+k-1])
    return ys

def maxmin(xs, k):
    return max(mins(xs, k, xs[:]))
def分钟(xs、k、ys):
如果k==1:返回ys
分钟(xs,k//2,ys)
对于x范围内的i(len(ys)):
如果i+k//2

我们递归地调用
mins
记录2(k)次,否则每次调用都会在ys数组上迭代一次。因此,算法是O(n log k)。

最好包含一个示例和解释,以补充问题陈述。@Dukeling抱歉,我忘了,请参阅更新!我明白你的意思了!相当整洁!只是想知道我们是否可以用“分而治之”的方式来做这件事?不过,尝试“分而治之”是一件事;您还必须处理这样一种可能性,即您正在寻找的
k
组位于分水岭上(因此在两半中都有位)。是的,在该部分应用这种数据结构方式可以给出O(nlogk)表示“分而治之”。谢谢我的大脑被卡住了。。。