Algorithms_6.006

PeakFinding

Introduce

Efficiency

当要面临的数据集十分庞大时,关注算法效率是非常有必要的

Scalability

可伸缩性是指算法能够在尽可能多的不同输入数据下正确运行,应该也可以理解为健壮性

Classic Data Structures

在6.006中我们将学习一些经典的数据结构

Algorithmic thinking

算法思维的培养

Peak finding

先来回顾下与复杂度相关的三个符号:

image-20210503150439276

问题定义

在一维数组中查找一个peak(峰值),peak是满足以下条件的数组元素的下标:

image-20210503151651981

如果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

image-20210503162958659

顺序遍历下查找peak的时间复杂度为Θ(n)

在使用分治思想后,算法的时间复杂度优化到了Θ(logn)

2D version

问题定义

image-20210503163654063

复杂度分析

image-20210503164323071

如果采用按序遍历整个matrix的方式查找peak,时间复杂度为Θ(n^2)

显然,这里同样可以使用devide&conquer的思想来处理二维情况下的问题:

Attempt

=== 思路同1D ===

获取中间列 mid
找到 mid 列中最大值max
if(max < 左邻居) { 查找左半部分数组 }	
if(max < 右邻居){ 查找右半部分数组 }
else { max 就是一个peak }
重复上述操作直到找到一个peak

Implementation

1D Ver.

image-20210505211551738

2D Ver.

image-20210505211450293

Source Code

https://github.com/AndyLeezCode/ClionProjects/tree/master/PeakFinding

posted @ 2021-05-05 21:21  盐盐盐の锅  阅读(42)  评论(0编辑  收藏  举报