【发布时间】:2021-04-04 18:22:26
【问题描述】:
我正在尝试创建一个算法,使用简单的方法在 N x N 矩阵中找到 所有峰值。但我在角落、第一行和最后一行以及第一列和最后一列面临一些问题。我正在考虑如下问题:
[ ][c][ ][ ] a is considered a 2d peak
[d][a][e][ ] or a hill iff a >= b,
[ ][b][ ][ ] a >= d, a >=c, a >=e
[ ][ ][ ][ ]
但是,当我需要将角评估为下面的表示时,c 和 d 不存在。我必须评估太多条件才能得到更通用的东西。即,对于下面的a,如果row-1 < 0,我需要检查位置a是否有效,那么我不需要检查以上的任何内容a 并且如果 col-1
[a][e][ ][ ]
[b][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
但是当我们把 a 带到其他角落甚至评估其他位置例如上面示例中的 e 时,我需要证明自己是否 e 位于 row-1 存在的有效位置,以防止评估该位置并得到错误(在上面的示例中,如果e >= the element in row-1,我肯定会得到错误检查。我'考虑到角落、第 0 行和第 n 行以及第 0 和第 n 列,我已经实现了一段代码,但我停下来开始思考如何使它更易读和更简单。
void find_hill(){
int i, j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
//check corners
if(i-1 < 0){
if(j-1 < 0){
//check if arr[i][j] >= arr at i,j+1 and i+1,j
}
if(j+1 > n-1){
//check if arr[i][j] >= arr at i,j-1 and i+1,j
}
}
}
}
}
我想在这里讨论如何找到解决方案。我应该从哪里开始做一些简单的事情?我想以某种方式使用类似于洪水填充的方法,但它分别填充每个位置,可能它不会工作,因为我最终会遇到同样的问题!
【问题讨论】:
-
你可以写一个函数
get(i, j, n),如果i和j有效则返回arr[i][j],否则返回INT_MIN。 -
@MOehm 是的,但这如何解决我需要检查 i-1、j-1、i+1 和 j+1 的问题,而不需要对角和顶部进行太多表达式,不是它的邻居之一的底部和侧面?
-
通过将条件检查移到函数中,您可以在客户端代码中无条件地探测所有四个方向。通过设置默认值
INT_MIN,您可以确保峰值测试会在边缘和角落找到峰值。不过,您仍然必须明确检查所有四个邻居。 -
(我的意思是看here。这两个答案有相似的方法来避免区分角落和边缘情况。)
-
很抱歉我没有正确解释
INT_MIN。 (不过,这不是 int 的最小大小,而是它的最小可能值。这些和类似的常量在<limits.h>中定义。)我只能说“你知道的一个小值小于矩阵”。如果您的所有值都是正数,则该值可能为 0。
标签: c algorithm matrix search multidimensional-array