dev*_*sda 27 arrays algorithm binary-search
给定一个整数数组,找到局部最小值.如果A [i-1]> A [i]和A [i] <A [i + 1],则元素A [i]被定义为局部最小值,其中i = 1 ... n-2.在边界元素的情况下,数量必须小于其相邻数字.
我知道如果只有一个局部最小值,那么我们可以用修改后的二进制搜索来解决.但是如果知道阵列中存在多个局部最小值,它能否及时解决O(log n)
?
tem*_*def 62
如果不保证数组元素是不同的,那么在O(log n)时间内不可能这样做.原因如下:假设您有一个数组,其中所有n> 1的值都相同.在这种情况下,没有元素可以是局部最小值,因为没有元素小于其邻居.但是,为了确定所有值都相同,您必须查看所有数组元素,这需要花费O(n)时间.如果使用的时间少于O(n),则无法查看所有数组元素.
另一方面,如果数组元素保证不同,您可以使用以下观察在O(log n)时间内解决此问题:
因此,您可以构建以下递归算法:
请注意,这具有递归关系
T(1)≤1
T(2)≤1
T(n)≤T(n/2)+ 1
使用主定理,您可以根据需要显示此算法在时间O(log n)中运行.
希望这可以帮助!
另请注意,只有当数组边缘小于相邻元素时,此算法的边数才算作局部最小值,此算法才有效.
局部最小值的数量可以是n/2
; 你无法及时列举它们O(log n)
.
小智 5
使用分而治之算法.设m = n/2,并检查值A [m](即数组中间的元素).
案例1:A [m-1] <A [m].然后数组的左半部分必须包含局部最小值,因此在左半部分递归.我们可以通过矛盾来证明这一点:假设A [i]不是每个0≤i<m的局部最小值.那么A [m-1]不是局部最小值,这意味着A [m-2] <A [m-1].类似地,A [m -3] <A [m -2].以这种方式继续,我们得到A [0] <A [1].但是A [0]是局部最小值,与我们最初的假设相反.
情况2:A [m + 1]> A [m].然后数组的右半部分必须包含局部最小值,因此在右半部分递归.这与案例1对称.
情况3:A [m-1]> A [m]和A [m + 1] <A [m].然后A [m]是局部最小值,所以返回它.运行时间重现是T(n)= T(n/2)+Θ(1),其产生T(n)=Θ(log n).
归档时间: |
|
查看次数: |
34082 次 |
最近记录: |