[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 算法思维,峰值寻找的更多相关文章

  1. MIT-6.006算法导论(2011秋)

    L01 Algorithmic Thinking,Peak Finding 算法定义:高效处理大量数据的程序 在学本课之前最好先学习6.042,本课进阶为6.046 本门课的8个主要章节:算法思想.排 ...

  2. 算法系列:寻找最大的 K 个数

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  3. [MIT6.006] 18. Speeding up Dijkstra 加速Dijkstra算法

    在之前的课我们讲过了Dijkstra算法,先回顾下,如下图: 那么如果加速DIjkstra算法寻找最短路径呢?这节课上讲师讲了两种方法:双向搜索(Bi-Directional Search)和目标方向 ...

  4. density peak聚类算法

    一个ppt很好讲解了density peak算法的要义:https://pan.baidu.com/s/1oCR-gF1o1kfV-L7HnIa8og 算法来源自论文:Clustering by fa ...

  5. [MIT6.006] 9. Table Doubling, Karp-Rabin 双散列表, Karp-Rabin

    在整理课程笔记前,先普及下课上没细讲的东西,就是下图,如果有个操作g(x),它最糟糕的时间复杂度为Ο(c2 * n),它最好时间复杂度是Ω(c1 * n),那么θ则为Θ(n).简单来说:如果O和Ω可以 ...

  6. [MIT6.006] 23. Computational Complexity 计算复杂度

    这节课主要讲的计算复杂度,一般有三种表达不同程度的计算复杂度,如下图所示: P:多项式时间: EXP:指数时间: R:有限时间内. 上图还给了一些问题的计算复杂度的对应结果,关于一些细节例如NP, N ...

  7. [MIT6.006] 22. Daynamic Programming IV: Guitar Fingering, Tetris, Super Mario Bro. 动态规划IV:吉他指弹,俄罗斯方块,超级玛丽奥

    之前我们讲到动态规划五步中有个Guessing猜,一般情况下猜有两种情况: 在猜和递归上:猜的是用于解决更大问题的子问题: 在子问题定义上:如果要猜更多,就要增加更多子问题. 下面我们来看如果像背包问 ...

  8. [MIT6.006] 20. Daynamic Programming II: Text Justification, Blackjack 动态规划II:文本对齐,黑杰克

    这节课通过讲解动态规划在文本对齐(Text Justification)和黑杰克(Blackjack)上的求解过程,来帮助我们理解动态规划的通用求解的五个步骤: 动态规划求解的五个"简单&q ...

  9. [MIT6.006] 19. Daynamic Programming I: Fibonacci, Shortest Path 动态规划I:斐波那契,最短路径

    这节课讲动态规划的内容,动态规划是一种通用且有效的算法设计思路,它的主要成分是"子问题"+"重用".它可以用于斐波那契和最短路径等问题的求解上. 一.斐波那契 ...

随机推荐

  1. javascript 数据类型判断总结

    一 typeof 回顾:js有五种基本数据类型:值类型("number","string","boolean","undefine ...

  2. docker的run操作

    docker的run到底做了什么操作呢? 它会优先寻找本地的镜像,如果没有就到仓库找,找不到返回错误,查找不到该镜像.能找到就拉这镜像下来,以该镜像为模板生产容器实例运行. 备注:图不是自己画的,截图 ...

  3. linux网卡驱动程序架构

    以cs89x0网卡驱动为例:

  4. TMS, XYZ & WMTS的不同

    WMS是OGC定义的协议,用于请求任意区域的渲染地图图像.客户可以根据需要以平铺模式对其进行请求. WMS-C是OSGeo创建的WMS扩展,它向功能文档中添加了元数据,以使客户端知道在哪里发出请求,从 ...

  5. 原生js实现一个自定义下拉单选选择框

    浏览器自带的原生下拉框不太美观,而且各个浏览器表现也不一致,UI一般给的下拉框也是和原生的下拉框差别比较大的,这就需要自己写一个基本功能的下拉菜单/下拉选择框了.最近,把项目中用到的下拉框组件重新封装 ...

  6. git-submodule子模块的添加、使用和删除

    目录 添加 使用 更新 删除 hugo添加主题的时候 命令如下: git submodule add https://github.com/samrobbins85/hugo-developer-po ...

  7. Spring官方都推荐使用的@Transactional事务,为啥我不建议使用!

    GitHub 17k Star 的Java工程师成神之路,不来了解一下吗! GitHub 17k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 17k Star 的Java工 ...

  8. 第六章 IP基本原理

    一.引入 1.IP是网络层协议,也是当今应用最广泛的网络协议之一 2.IP协议规定了数据的封装方式,网络节点的标识方法,用于网络上数据的端到端的传递. 二.IP协议概述 1.IP及相关协议 2.IP的 ...

  9. APP脱壳方法三

    第一步 手机启动frida服务 第二步 手机打开要脱壳的app 第三步编辑hook代码 agent.js /* * Author: hluwa <hluwa888@gmail.com> * ...

  10. 【转】Python3 如何优雅地使用正则表达式(完整版)

    转载自鱼c论坛 :  https://fishc.com.cn/thread-57073-1-1.html 注:本文翻译自 Regular Expression HOWTO,小甲鱼童鞋对此做了一些注释 ...