zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    subString源码分析
    我的three.js学习记录(三)
    我的three.js学习记录(二)
    2017-10-15
    我的three.js学习记录(一)
    我的Spring学习记录(三)
    我的Spring学习记录(二)
    我的Hibernate学习记录(二)
    我的Hibernate学习记录(一)
    Tomcat学习笔记
  • 原文地址:https://www.cnblogs.com/potofsalt/p/14732786.html
Copyright © 2011-2022 走看看