MIT6.006 课程笔记P1 - 思考如何进行 PeakFinding

文章目录

      • 寻找峰值 peak
      • 暴力算法
      • 分而治之
      • 从1D到2D
        • 朴素算法
        • Attemp#2

寻找峰值 peak

给出一个数组 a b c d e f g h i
并给予数字 index 1 2 3 4 5 6 7 8 9
那么如果某个数字是 peak ,那么他将 大于等于左边的数大于等于右边的数
或者 a >= b 这里的 a 也是峰值

暴力算法

简单的暴力算法思路即:从左往右遍历
复杂度显然为:O(n)
那么看看能否改进一下暴力算法?

分而治之

Use a divide and conquer strategy, and recursively break;
判断 a[n/2] 和 a[n/2-1]a[n/2] 和 a[n/2+1] 进行二分答案搜索
这就使得复杂度降为:MIT6.006 课程笔记P1 - 思考如何进行 PeakFinding_第1张图片
在同样情况下,运行暴力算法需要13秒,使用分而治之策略只花0.001秒
详细的算法实现可以参考:CSDN 作者链接

从1D到2D

一维的问题解决了,那么思考如果问题来到二维呢?
此时的 peek 会定义为 a>=b, a>=c, a>=d, a>=e

MIT6.006 课程笔记P1 - 思考如何进行 PeakFinding_第2张图片

朴素算法

课中的教师称之为 Greedy Ascent 算法,从一个地方出发,逐渐往最高的数字移动:

MIT6.006 课程笔记P1 - 思考如何进行 PeakFinding_第3张图片

Attemp#2

  • 寻找一个 Middle Column,即 j = m / 2
  • Find global maximum on Column j at (i, j)
  • 比较 (i, j-1) (i, j) (i, j+1)
  • 如果 (i, j-1) > (i, j) 选择左边的一列!
  • 最终,如果 (i, j) >= (i ,j-1), (i, j+2),那么 (i, j) 就是一个 2D peak

你可能感兴趣的:(算法,笔记)