[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. shell-脚本的建立和执行

    1. shell脚本的建立和执行  1) shell脚本的建立 在linux系统中,shell脚本(bash shell程序)通常是在编辑器(如vi/vim)中编写,由unix/linux命令.bas ...

  2. ansible-初始playbook安装nginx

    1. ansible-初始playbook安装nginx 1) 创建一个ansible存放路径 1 [root@test-1 scripts]# mkdir -p /ansible/nginx/{co ...

  3. LR之Oracle 2tier协议录制Oracle脚本

    在一次测试中,需用到sql去查询Oracle数据,并去使用改数据时,查阅各种资料终于实现LoadRunner对Oracle数据库进行操作,分享给大家,也与大家共同进步~   同时也可用Loadrunn ...

  4. Fullscreen API与DOM监听API

    前言 以下几个API,在web开发中可以简化我们一部分交互操作. Fullscreen API 有时候我们想要全屏预览的效果,比如类似于图片预览.幻灯片播放等.全屏API是一个很好的选择. 基本用法 ...

  5. 迅雷bt种子的制作

    BT是目前最热门的下载方式之一,它的全称为"BitTorrent"简称"BT",中文全称"比特流",但很多朋友将它戏称为"变态下载 ...

  6. Windows下CertUtil校验和编码文件

    目录 前言 CertUtil计算文件hash 计算MD2 计算MD4 计算MD5 计算SHA1 计算SHA256 计算SHA384 计算SHA512 文件base64编码 文件base64解码 文件h ...

  7. day33 Pyhton logging 模块和包

    一内容回顾 try/except try/except/else try/finally try/except try/except/finally try/except/else/finally 报 ...

  8. Spring Boot与多数据源那点事儿~

    持续原创输出,点击上方蓝字关注我 目录 前言 写这篇文章的目的 什么是多数据源? 何时用到多数据源? 整合单一的数据源 整合Mybatis 多数据源如何整合? 什么是动态数据源? 数据源切换如何保证线 ...

  9. oracle强制修改字符集

    首先查看服务端字符集 select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET' NLS_CHARACTERSET WE8M ...

  10. if当中是赋值怎么办

    1.Java中,赋值是有返回值的 ,赋什么值,就返回什么值.比如这题,x=y,返回y的值,所以括号里的值是1. 2.Java跟C的区别,C中赋值后会与0进行比较,如果大于0,就认为是true:而Jav ...