Complexity And Finding Peaks
渐近表示法(Asymptotic Notation)
我们如何根据复杂度的顺序对算法进行比较和排序?
以下是三种常用的复杂性度量标准顺序:
- Big O
- Big Omega
- Big Theta
其中Big O比起Big Omega和Big Theta更被广泛的接受和使用。
Big-O(Big O)
我们使用Big O来渐近地将一个函数的运行时间的增长限制在一个常数因子内,使另一个函数的增长降低或同阶。
Big O(上界)与算法的最坏情况行为有关。
Big O定义
算法分析的总体规划
- 决定参数n表示输入大小。
- 识别算法的基本操作。
- 确定输入大小为n的最坏情况。
- 可能还需要确定平均和最好的情况
- 建立一个表示算法的基本操作执行次数的和。
- 使用标准公式和规则简化求和,确定算法运行时间的big-O h。
寻找峰值 (Peak Finding)
如果我们有一个数字数组,我们可以将一个峰值定义为满足以下条件的任意数字:
- 如果它是第一个(或最后一个)数字,如果它大于或等于它的邻居,那么它就是一个峰值。
- 对于任何其他位置,如果它大于或等于它的相邻位置,那么它就是一个峰值。
- 邻居是紧挨着当前数字的另一个数字。
举例:
假设我们有以下数组:
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
有两种有效的算法可以寻找峰值:
- 线性搜索
- 二分搜索
线性搜索
下面的伪代码算法使用线性搜索来寻找一个峰值:
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
- Introduction to The Design and Analysis of Algorithms, A. Levitin, 3rd Ed., Pearson 2011.
- Introduction to Algorithms, T. H. Cormen, 3rd Ed, MIT Press 2009.