首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >二维峰值算法找不到峰值

二维峰值算法找不到峰值
EN

Stack Overflow用户
提问于 2020-09-29 10:19:55
回答 1查看 58关注 0票数 0

我刚刚开始了麻省理工学院的算法课程,我们被教了2D峰值查找算法。我尝试了干式运行并实现了它,但是对于这个输入来说,algo似乎失败了。

代码语言:javascript
运行
复制
{5, 0, 3, 2}
{1, 1, 2, 4}
{1, 2, 4, 4}

这就是算法:

代码语言:javascript
运行
复制
• Pick middle column j = m/2
• Find global maximum on column j at (i,j)
• Compare(i,j−1),(i,j),(i,j+1)
• Pick left columns of(i,j−1)>(i,j)
• Similarly for right
• (i,j) is a 2D-peak if neither condition holds ← WHY?
• Solve the new problem with half the number of columns.
• When you have a single column, find global maximum and you‘re done.

Update,下面是我尝试过的代码,它似乎不起作用:

代码语言:javascript
运行
复制
#include <bits/stdc++.h> 
using namespace std; 

const int MAX = 100; 

int findMax(int arr[][MAX], int rows, int mid, int& max) 
{ 
    int max_index = 0; 
    for (int i = 0; i < rows; i++) { 
        if (max < arr[i][mid]) { 
            max = arr[i][mid]; 
            max_index = i; 
        } 
    } 
    return max_index; 
} 

int findPeakRec(int arr[][MAX], int rows, int columns, int mid) 
{ 
    int max = 0; 
    int max_index = findMax(arr, rows, mid, max); 
    if (mid == 0 || mid == columns - 1) 
        return max; 
    if (max >= arr[max_index][mid - 1] && max >= arr[max_index][mid + 1]) 
        return max; 
    if (max < arr[max_index][mid - 1]) 
        return findPeakRec(arr, rows, columns, mid - ceil((double)mid / 2)); 
    return findPeakRec(arr, rows, columns, mid + ceil((double)mid / 2)); 
} 

int findPeak(int arr[][MAX], int rows, int columns) 
{ 
    return findPeakRec(arr, rows, columns, columns / 2); 
} 

int main() 
{ 
    int arr[][MAX] = { { 5, 0, 3, 2 }, 
                       { 1, 1, 2, 4 }, 
                       { 1, 2, 4, 4 }, 
                       { 3, 2, 0, 1 } }; 
    int rows = 4, columns = 4; 
    cout << findPeak(arr, rows, columns); 
    return 0; 
} 

我就是这样实现算法的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-29 16:08:51

该算法是正确的(只是第四个项目中的拼写错误:"of“应读"if")。

你漏掉了“峰值”的正确定义。找峰算法的目的是找出局部最大值,而不一定是全局最大值。对于全局最大值,算法是微不足道的,您只需逐行扫描查找最大值。

但是,峰值查找可能更有效,因为并不是所有的值都需要检查。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64117596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档