给定一个整数数组,找到局部最小值。如果Ai-1 > Ai且Ai < Ai+1其中i= 1...n-2,则元素Ai被定义为局部最小值。在边界元素的情况下,该数字必须小于其相邻的数字。
我知道如果只有一个局部最小值,那么我们可以用改进的二进制搜索来解决。但是,如果知道数组中存在多个局部最小值,能否在O(log n)
时间内解决?
发布于 2012-09-03 01:49:32
如果不能保证数组元素是不同的,那么就不可能在O(log )时间内做到这一点。原因如下:假设您有一个数组,其中所有n>1的值都是相同的。在这种情况下,没有一个元素可以是局部最小值,因为没有一个元素小于它的邻居。但是,为了确定所有值都是相同的,您必须查看所有数组元素,这需要O(n)时间。如果您使用的时间少于O(n),则不必查看所有数组元素。
另一方面,如果保证数组元素是不同的,则可以使用以下观察结果在O(log )时间内解决此问题:
因此,您可以构建以下递归算法:
请注意,这具有递归关系
T(1)≤1
T(2)≤1
T(n)≤T(n / 2) +1
使用主定理,您可以根据需要证明此算法的运行时间为O(log )。
希望这能有所帮助!
还请注意,仅当数组的边小于相邻元素时,此算法才有效。
发布于 2012-09-03 01:44:45
局部最小值的数量可以是n/2
;您不能在O(log n)
时间内将其全部枚举。
发布于 2014-01-21 01:33:51
使用分而治之的算法。设m= n/2,检查Am的值。
案例1: Am−1 < Am那么数组的左半部分必须包含一个局部最小值,所以在左半部分上递归。我们可以用矛盾的方式来表示这一点:假设对于每个0≤i< m,Ai不是局部最小值,那么Am−1不是局部最小值,这意味着Am−2 < Am−1。类似地,Am−3 < Am−2。以这种方式继续,我们得到A
案例2: Am +1> Am那么数组的右半部分必须包含一个局部最小值,所以在右半部分上递归。这与情况1是对称的。
案例3: Am−1> Am和Am +1< Am那么Am是一个局部最小值,所以返回它。运行时间递归为T(n) = T(n/2) +Θ(1),其结果是T(n) =Θ(log )。
https://stackoverflow.com/questions/12238241
复制相似问题