找到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在开始和结束时大于1个元素,该阵列是H [0到m + 1],其中H [0] = H [m + 1] = -infinity。因此,H [0]和H [m + 1]是哨兵。那么如果H [p-1]≤H[p]≥H[p + 1],则元素p(其中1≤p≤n)是一个峰值。
我认为渐近时间复杂度是O(log n),但我不确定。如果可以,请帮忙,非常感谢。
答案 0 :(得分:2)
不,它不是O(log m)。例如,如果H增加,则循环执行alt enter
次,因为唯一的峰值是最后一个元素。所以最坏的情况是O(m)。
O(log m)解决方案如下所示:要在数组中找到端点元素小于其邻居的峰值,请考虑数组的中间元素。如果它是一个峰值,那么停止。否则,如果它小于左侧的元素,则在数组的左半部分找到一个峰值。如果它小于右边的元素,则在数组的右半部分找到一个峰值。它必须小于其中一个,因为它不是峰值。这大约每次都将阵列的大小减半,并且它保证终止,因为一旦数组达到大小3,中间元素就保证是峰值,因为结束元素是(通过构造)小于他们的邻居 - 中间元素。