Algorithms_6.006
PeakFinding
Introduce
Efficiency
当要面临的数据集十分庞大时,关注算法效率是非常有必要的
Scalability
可伸缩性是指算法能够在尽可能多的不同输入数据下正确运行,应该也可以理解为健壮性
Classic Data Structures
在6.006中我们将学习一些经典的数据结构
Algorithmic thinking
算法思维的培养
Peak finding
先来回顾下与复杂度相关的三个符号:
问题定义
在一维数组中查找一个peak(峰值),peak是满足以下条件的数组元素的下标:
如果position_2为一个peak,当且仅当 b≥a && b大于等于c
特别的,如果position_9是一个peak,当且仅当 i>h
Thoughts
Devide&Conquer
” 分而治之 “
二分数组查看元素 a[n/2],
获取中间元素 a[n/2]
if(a[n/2] < a[n/2-1]) { 查找左半部分数组 }
else if(a[n/2] < a[n/2+1]){ 查找后半部分数组 }
else { a[n/2] 就是一个peak }
重复上述操作直到找到一个peak
Complexity
顺序遍历下查找peak的时间复杂度为Θ(n)
在使用分治思想后,算法的时间复杂度优化到了Θ(logn)
2D version
问题定义
复杂度分析
如果采用按序遍历整个matrix的方式查找peak,时间复杂度为Θ(n^2)
显然,这里同样可以使用“ devide&conquer ”的思想来处理二维情况下的问题:
Attempt
=== 思路同1D ===
获取中间列 mid
找到 mid 列中最大值max
if(max < 左邻居) { 查找左半部分数组 }
if(max < 右邻居){ 查找右半部分数组 }
else { max 就是一个peak }
重复上述操作直到找到一个peak
Implementation
1D Ver.
2D Ver.
Source Code
https://github.com/AndyLeezCode/ClionProjects/tree/master/PeakFinding