如何在2D阵列中找到鞍点?

时间:2017-02-06 18:36:42

标签: c arrays 2d

我试图编写伪代码来查找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]

2 个答案:

答案 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;

如果预计的鞍点数量未知,请记住两个选项:

  1. 使数组大小为x * y(Hmm。)

  2. 使用malloc为数组分配存储空间。

  3. 对于第二个选项malloc / realloc可以使用。 通常会使用一种技巧:如果存储空间不足,则realloc用于为多个其他元素分配新空间。因此,重新分配的数量减少了,因为realloc被计为"昂贵"操作。在这种情况下,使用两个计数变量:一个用于分配数组的大小,另一个用于实际使用的元素的数量。当然,第二个必须总是小于或等于第一个。