[MIT6.006] 1. Algorithmic Thinking, Peak Finding 算法思维,峰值寻找
[MIT6.006] 系列笔记将记录我观看《MIT6.006 Introduction to Algorithms, Fall 2011》的课程内容和一些自己补充扩展的知识点。该课程主要介绍了一些基础的算法,课程主要内容分为以下八个模块:
| 模块 | 例子 |
| Algorithmic Thinking 算法思维 | Peak Finding 峰值寻找 |
| Sorting & trees 排序和树 | Event Simulation 事务模拟 |
| Hashing 哈希 | Genome Comparison 基因组对比 |
| Numerics 数值 | RSA Encryption RSA加密 |
| Graphs 图 | Rubiks Cube 魔方 |
| Shorest Paths 最短路径 | Caltech -> MIT |
| Dynamic Programming 动态规划 | Image Compression 图片压缩 |
| Advanced Topics 高级主题 |
1. Algorithmic Thinking, Peak Finding 算法思维,峰值寻找
假设有一个如下图的一维数列,格子下的数字代表它们的索引位置,位置2为峰值peak,b必须满足:b≥a和b≤c。如果位置9为峰值,i≥h。这里是含有‘等于’是因为峰值寻找是建立“任何数列都存在峰值”的假设上。
直接采用最简单且最直接的峰值寻找方式,它的时间复杂度是ο(n)。为了实现更快的查询方法,我们可以采用二分查找(Binary Search)的思想,如下图所示:

二分寻找峰值法主要步骤(假设上图数列为a,长度为n):
- 先找到中间位置的数值a[n/2];
- if a[n/2]<a[n/2 - 1],则在左边1至n/2 - 1的元素中寻找峰值;
- else if a[n/2]<a[n/2 + 1],则在右边n/2 + 1至n的元素中寻找峰值;
- else: n/2位置上的元素是峰值。
二分峰值寻找法的时间复杂度是ο(log2n)。跟二分法类似思路的时间复杂度常与log2n挂钩。
假设有一个如下图的二维网格图,如果a≥b, a≥d, a≥c, a≥e,则a是2D-peak。

如果采用如下图所示的贪心算法,它的时间复杂度是ο(nm)。

而另一种方法是加入了二分查找思路去做:

如上图所示:
- 首先,选中间列 j=m/2;
- 遍历列j的所有元素,找到列j的全局最大值val(i, j);
- 对比val(i, j-1), val(i, j), val(i, j+1);\
- 如果val(i, j-1) > val(i, j),选择左边列继续重复以上步骤。相似地,如果val(i, j+1) > val(i, j),选择右边列重复上面步骤。如果val(i, j)≥val(i, j-1)和val(i, j+1),则val(i,j )就是2D-peak。
二分查找2D峰值的时间复杂度是ο(nlog2m),即在行(n)上寻找最大值 * 在列(m)上进行二分查找。
[MIT6.006] 1. Algorithmic Thinking, Peak Finding 算法思维,峰值寻找的更多相关文章
- MIT-6.006算法导论(2011秋)
L01 Algorithmic Thinking,Peak Finding 算法定义:高效处理大量数据的程序 在学本课之前最好先学习6.042,本课进阶为6.046 本门课的8个主要章节:算法思想.排 ...
- 算法系列:寻找最大的 K 个数
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- [MIT6.006] 18. Speeding up Dijkstra 加速Dijkstra算法
在之前的课我们讲过了Dijkstra算法,先回顾下,如下图: 那么如果加速DIjkstra算法寻找最短路径呢?这节课上讲师讲了两种方法:双向搜索(Bi-Directional Search)和目标方向 ...
- density peak聚类算法
一个ppt很好讲解了density peak算法的要义:https://pan.baidu.com/s/1oCR-gF1o1kfV-L7HnIa8og 算法来源自论文:Clustering by fa ...
- [MIT6.006] 9. Table Doubling, Karp-Rabin 双散列表, Karp-Rabin
在整理课程笔记前,先普及下课上没细讲的东西,就是下图,如果有个操作g(x),它最糟糕的时间复杂度为Ο(c2 * n),它最好时间复杂度是Ω(c1 * n),那么θ则为Θ(n).简单来说:如果O和Ω可以 ...
- [MIT6.006] 23. Computational Complexity 计算复杂度
这节课主要讲的计算复杂度,一般有三种表达不同程度的计算复杂度,如下图所示: P:多项式时间: EXP:指数时间: R:有限时间内. 上图还给了一些问题的计算复杂度的对应结果,关于一些细节例如NP, N ...
- [MIT6.006] 22. Daynamic Programming IV: Guitar Fingering, Tetris, Super Mario Bro. 动态规划IV:吉他指弹,俄罗斯方块,超级玛丽奥
之前我们讲到动态规划五步中有个Guessing猜,一般情况下猜有两种情况: 在猜和递归上:猜的是用于解决更大问题的子问题: 在子问题定义上:如果要猜更多,就要增加更多子问题. 下面我们来看如果像背包问 ...
- [MIT6.006] 20. Daynamic Programming II: Text Justification, Blackjack 动态规划II:文本对齐,黑杰克
这节课通过讲解动态规划在文本对齐(Text Justification)和黑杰克(Blackjack)上的求解过程,来帮助我们理解动态规划的通用求解的五个步骤: 动态规划求解的五个"简单&q ...
- [MIT6.006] 19. Daynamic Programming I: Fibonacci, Shortest Path 动态规划I:斐波那契,最短路径
这节课讲动态规划的内容,动态规划是一种通用且有效的算法设计思路,它的主要成分是"子问题"+"重用".它可以用于斐波那契和最短路径等问题的求解上. 一.斐波那契 ...
随机推荐
- docker 启动redis/nginx
1.docker 启动redis # redis docker run -itd --name redis-test -p 16379:6379 redis 2.docker 启动nginx ...
- spring boot:thymeleaf给fragment传递参数的方法(spring boot 2.3.3)
一,thymeleaf如何给fragment传递参数? 1,如果是全局的参数,可以用interceptor中传递 非全局参数,可以从controller中传递 2,引用片断时也可以传递参数 说明:刘宏 ...
- go 协程阻塞
func main() { wg.Add(2) go test1() go test2() wg.Wait() } func test1() { defer wg.Done() for i:=0;i& ...
- js获取页面高度
<script> function getInfo() { var s = ""; s += " 网页可见区域宽:"+ document.body. ...
- Cypress系列(68)- request() 命令详解
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 作用 发起一个 HTTP 请求 语法格式 ...
- Flutter Webview添加Cookie的正确姿势
场景 h5页面要从cookie里面取数据,所以需要在flutter webview的cookie里面塞一些数据,设置的数据多达十几条:按照网上查的使用方式来设置,通过fiddler抓包发现,只能生效一 ...
- 阿里技术专家十五问,真题面试刀刀见肉,快来和阿里面试官battle
引言 2020阿里巴巴专家组出题,等你来答: 题目:如何判断两个链表是否相交 出题人:阿里巴巴新零售技术质量部 参考答案: $O(n^2)$: 两层遍历,总能发现是否相交 $O(n)$: 一层遍历,遍 ...
- poj1011 Sticks (搜索经典好题)
poj1011 Sticks 题目连接: poj1011 Description George took sticks of the same length and cut them randomly ...
- LinkBlockedQueue的c++实现
c++链表实现的阻塞队列 最近从java源码里发现了阻塞队列的实现,觉得非常有趣. 首先,介绍下什么是阻塞队列.阻塞队列代表着一个队列可以线程安全的往该队列中写数据和从该队列中读数据.也就是说,我们可 ...
- win10系统出现“VMware Workstation与Device/Credential Guard不兼容”的解决办法
办公室win10 64位系统安装的VMware Workstation,有一天启动时出现提示"VMware Workstation 与 Device/Credential Guard 不兼容 ...