我试图编写伪代码来查找2D数组中的所有鞍点。鞍点是其中行的最小值,但列中的最大值,或其行中的最大值和列中的最小值。
我无法绕过如何存储这些值的地方,特别是如果同一行或列中有2个鞍点。我也不确定我是否正确地接近这个,也许它可以以更有效的方式完成?
数组由A [x] [y]给出,其中x是行,y是列。
到目前为止,我的(非常基本的)伪代码是
for r=0 to y-1 // iterates through every row
for c=0 to x-1 //iterates through every element in row r
min=min(A[c][r]) //finds the minimum value in row r
for p=0 to y-1 //iterates through every element in col c
max=max(A[c][p]) //finds max in col c
if min==max
saddle point=A[c][p]
答案 0 :(得分:0)
您的伪代码似乎有两个主要问题。
1)你已经交换了原始和colums
2)将数组元素(aka值)传递给min / max没有多大意义。您可能应该传递一个行号,并具有返回列号的功能。
一种简单的方法是找到行r中保持最小值的列的索引。然后找到该列中包含最大值的行的索引。 如果两行索引相同,则表示您有一个鞍点。
类似的东西:
for r=0 to x-1 // iterates through every row
// Check min-max combination
c = min_in_row(r) //find index of the column holding the minimum value in row r
r2 = max_in_column(c) //find index of the row holding the maximum value in column c
if (r == r2)
{
// Saddle point found
printf("r=%d c=%d value %d is a saddle point\n", r, c, A[r][c]);
}
// Repeat the same for the max-min combination
答案 1 :(得分:0)
任何鞍点都可以与(行,列)一起存储。在C:
struct Saddle { int row, col; };
如果已知最大预期鞍点数,则可以使用结果数组:
/* max. number of saddle points */
#define MAX_FOUND 16
/* row/col. of found saddle points */
struct Saddle found[MAX_FOUND];
/* number of found saddle points */
int nFound = 0;
存储新结果:
found[nFound].row = r;
found[nFound].col = c;
++nFound;
如果预计的鞍点数量未知,请记住两个选项:
使数组大小为x * y(Hmm。)
使用malloc为数组分配存储空间。
对于第二个选项malloc
/ realloc
可以使用。
通常会使用一种技巧:如果存储空间不足,则realloc用于为多个其他元素分配新空间。因此,重新分配的数量减少了,因为realloc被计为"昂贵"操作。在这种情况下,使用两个计数变量:一个用于分配数组的大小,另一个用于实际使用的元素的数量。当然,第二个必须总是小于或等于第一个。