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

  • 相关阅读:
    module 和 component 的区别
    API、SDK、DLL有什么用?
    app基本控件
    PaaS是什么?
    js回调函数(callback)(转载)
    多语言 SEO
    axure rp 8.0
    整天看用户埋点数据,知道数据是咋来的吗?
    发现恶意ip大量访问 可使用命令进行封禁
    阿里云服务器迁移更改IP,导致网站挂掉
  • 原文地址:https://www.cnblogs.com/potofsalt/p/14732786.html
Copyright © 2011-2022 走看看