【问题标题】:is the asymptotic time complexity of this algorithm O(log n)?这个算法的渐近时间复杂度是 O(log n)?
【发布时间】:2017-03-05 01:22:47
【问题描述】:

找到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] 就是峰值。

假设数组H在开头和结尾都大了1个元素,数组为H[0到m+1],其中H[0] = H[m+1] = -infinity。因此,H[0] 和 H[m+1] 是哨兵。那么元素 p,其中 1 ≤ p ≤ n,如果 H[p-1] ≤ H[p] ≥ H[p+1],则为一个峰值。

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

【问题讨论】:

    标签: algorithm big-o asymptotic-complexity


    【解决方案1】:

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

    O(log m) 解决方案如下所示:要在数组中找到末端元素小于其相邻元素的峰值,请考虑数组的中间元素。如果是高峰,那就停下来。否则,如果它小于其左侧的元素,则在数组的左半部分找到一个峰值。如果它小于其右侧的元素,则在数组的右半部分找到一个峰值。它必须小于一个或另一个,因为它不是一个峰值。这每次大约将数组的大小减半,并且保证会终止,因为一旦数组达到大小 3,中间元素就保证是峰值,因为末端元素(通过构造)小于它们的邻居-- 中间元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2011-07-09
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      相关资源
      最近更新 更多