Algorithm 该算法的渐近时间复杂度是O(logn)?

Algorithm 该算法的渐近时间复杂度是O(logn)?,algorithm,big-o,asymptotic-complexity,Algorithm,Big O,Asymptotic Complexity,查找p的伪代码算法为: peakreturn(H) for p=1 to m //m is the length of H if H[p-1] ≤ H[p] and H[p] ≥ H[p+1] then return p return nil // only returns this if there is no peak 假设我有一个int值的数组H[1到m],其中“p”是峰值元素,如果: H[p] ≥ H[p+1] if p = 1, H[p-1] ≤ A[p] ≥ H[p+1]

查找p的伪代码算法为:

peakreturn(H)
for p=1 to m //m is the length of H
    if H[p-1] ≤ H[p] and H[p] ≥ H[p+1] then return p
return nil // only returns this if there is no peak
假设我有一个int值的数组H[1到m],其中“p”是峰值元素,如果:

H[p] ≥ H[p+1] if p = 1,
H[p-1] ≤ A[p] ≥ H[p+1] if 1 < p < m,
H[p] ≥ H[p-1] if p = m.
H[p]≥ H[p+1]如果p=1,
H[p-1]≤ A[p]≥ H[p+1]如果1
基本上,如果H[p]大于或等于其相邻元素,则H[p]为峰值

假设数组H在开始和结束时大于1个元素,数组为H[0到m+1],其中H[0]=H[m+1]=-无穷大。因此,H[0]和H[m+1]是哨兵。然后是元素p,其中1≤ P≤ n、 是H[p-1]的峰值≤ H[p]≥ H[p+1]

我认为渐近时间复杂度是O(logn),但我不确定。如果可以,请帮忙,非常感谢。

不,不是O(log m)。例如,如果H增加,则循环执行
m
次,因为唯一的峰值是最后一个元素。所以最坏的情况是O(m)

一个O(log m)的解决方案是这样的:要找到一个数组中的顶点,其中端点元素比它们的邻居小,考虑数组的中间元素。如果是峰值,则停止。否则,如果它小于左边的元素,则在数组的左半部分找到一个峰值。如果它比右边的元素小,在数组的右半部分找到一个峰值。它一定比其中一个小,因为它不是一个峰值。这大约是每次数组大小的一半,它保证会终止,因为一旦数组达到大小3,中间元素就保证是一个峰值,因为末端元素(通过构造)比它们的邻居--中间元素小。

不,它不是O(log m)。例如,如果H增加,则循环执行
m
次,因为唯一的峰值是最后一个元素。所以最坏的情况是O(m)

一个O(log m)的解决方案是这样的:要找到一个数组中的顶点,其中端点元素比它们的邻居小,考虑数组的中间元素。如果是峰值,则停止。否则,如果它小于左边的元素,则在数组的左半部分找到一个峰值。如果它比右边的元素小,在数组的右半部分找到一个峰值。它一定比其中一个小,因为它不是一个峰值。这大约是每次数组大小的一半,它保证终止,因为一旦数组达到大小3,中间元素保证是一个峰值,因为末端元素(通过构造)比它们的邻居——中间元素小