算法和数据结构之复杂度与寻找峰值

Complexity And Finding Peaks

  • 渐近表示法(Asymptotic Notation)
  • Big-O(Big O)
    • Big O定义
  • 算法分析的总体规划
  • 寻找峰值 (Peak Finding)
    • 线性搜索
    • 二分搜索
  • References

渐近表示法(Asymptotic Notation)

我们如何根据复杂度的顺序对算法进行比较和排序?
以下是三种常用的复杂性度量标准顺序:

  1. Big O
  2. Big Omega
  3. Big Theta
    其中Big O比起Big Omega和Big Theta更被广泛的接受和使用。

Big-O(Big O)

我们使用Big O来渐近地将一个函数的运行时间的增长限制在一个常数因子内,使另一个函数的增长降低或同阶。
Big O(上界)与算法的最坏情况行为有关。

Big O定义

算法和数据结构之复杂度与寻找峰值_第1张图片

算法分析的总体规划

  1. 决定参数n表示输入大小。
  2. 识别算法的基本操作。
  3. 确定输入大小为n的最坏情况。
  4. 可能还需要确定平均和最好的情况
  5. 建立一个表示算法的基本操作执行次数的和。
  6. 使用标准公式和规则简化求和,确定算法运行时间的big-O h。

寻找峰值 (Peak Finding)

如果我们有一个数字数组,我们可以将一个峰值定义为满足以下条件的任意数字:

  1. 如果它是第一个(或最后一个)数字,如果它大于或等于它的邻居,那么它就是一个峰值。
  2. 对于任何其他位置,如果它大于或等于它的相邻位置,那么它就是一个峰值。
  3. 邻居是紧挨着当前数字的另一个数字。

举例:
假设我们有以下数组:
8 6 4 9 7 7 7 3 10 5

8 > 6所以8是一个峰值。
9>4, 9>7 所以9是一个峰值。
7=7, 7=7 所以7是一个峰值。
7=7, 7>3 所以7是一个峰值。
10>3, 10>5 所以10是一个峰值。
所以该数组有5个峰值:
8 6 4 9 7 7 7 3 10 5

有两种有效的算法可以寻找峰值:

  1. 线性搜索
  2. 二分搜索

线性搜索

下面的伪代码算法使用线性搜索来寻找一个峰值:

for index = 1 to n-1
if values[index] >= values[index+1] then
print “there is a peak with value ”, values[index],” at position ”,index
stop
fi
rof
print “there is a peak with value ”,values[n],” at position ”,n

然而这个算法在n很大时表现不佳

二分搜索

下面的伪代码算法使用二分搜索来寻找一个峰值:

start = 1
end = n
repeat
mid = (start + end)/2
if values[mid] < values [mid - 1] then
end = mid – 1
else if values[mid] < values [mid + 1] then
start = mid+1
else
print “peak found at position ”, mid, “with value”, values[mid]
stop
fi
until forever

一维数组峰值查找:在一维数组中查找峰值可能需要 O(n) 时间(使用线性搜索)和O(log n)时间(使用二分搜索)。

二维数组峰值查找:在n x n 2D数组中查找峰值可能需要 O(n^2 )时间(使用线性搜索)和O(nlogn)时间(使用二分搜索)。

References

  1. Introduction to The Design and Analysis of Algorithms, A. Levitin, 3rd Ed., Pearson 2011.
  2. Introduction to Algorithms, T. H. Cormen, 3rd Ed, MIT Press 2009.

你可能感兴趣的:(算法和数据结构,数据结构,算法,复杂度,寻找峰值,Finding,Peaks)