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

渐近表示法(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. 决定参数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.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值