2017-02-06 6 views
-1

Я пытаюсь написать псевдокод, чтобы найти все точки седла в 2D-массиве. Седловые точки - это пятна, где значение - это минимальное значение в его строке, но максимальное значение в его столбце или максимальное значение в его строке и минимальное значение в его столбце.Как найти седловые точки в двумерном массиве?

У меня возникли проблемы с тем, как хранить эти значения, особенно если в одной строке или столбце есть две точки седла. Я также не уверен, что если я даже приблизился к этому правильно, возможно, это можно сделать более эффективным способом?

Массив задается 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

Если у вас есть синусоидальная волна в течение периода 10π, у вас будет много минимумов и максимумов; вы не можете просто искать минимум в столбце (или строке).Для каждого значения вы должны посмотреть на следующее и предыдущие значения в столбце (или строке) и посмотреть, меньше ли текущее значение, чем оба, или больше, чем оба, идентифицируя локальный минимум или максимум. Затем вам нужно посмотреть в другом направлении и посмотреть, находитесь ли вы на локальном максимуме или минимуме в этом направлении. Только если оба выполняются одновременно, вы находитесь в седловой точке. –

+0

Может ли кто-нибудь объяснить, как найти, есть ли два равных минимума подряд? Скажем, что первый и последний элементы одинаковы, и они кажутся минимальными, как бы я отслеживал их? – Newbie18

+0

Это вопрос определения того, будут ли края считаться максимумами или минимумами. У вас может быть много локальных максимумов или минимумов в одной строке или столбце. Так как может быть много седловых очков, вам нужно будет отследить их всех - список седловых очков. Я предполагаю, что у вас будет цикл 'for r = 0 to y-1', содержащий цикл' for c = 0 to x-1', а тело внутреннего цикла будет смотреть, есть ли у вас локальный максимум или минимум в направлении строки (продолжая следующий «c», если нет), а затем проверьте, есть ли у вас локальный минимум или максимум в направлении столбца и т. д. Однако я его не закодировал. –

ответ

0

Вы, кажется, есть две основные проблемы с псевдокоде.

1) Вы обменяли на баран и colums

2) Переходя к элементу массива (он же значение) в мин/макса не имеет особый смысла. Вероятно, вы должны передать номер строки и вернуть функцию номер столбца.

Простым способом является поиск индекса столбца, содержащего минимальное значение в строке 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 
+0

Как бы сохранить все позиции найденных седловых точек и вернуть их после того, как весь массив прошел, вместо того, чтобы печатать их по одному? – Newbie18

+0

@ShaynaGrose - создать 'struct point {int r; int c;) 'затем используйте malloc/realloc для выделения памяти для найденных точек и возврата указателя на эту память. – 4386427

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.

Для 2-го варианта malloc/realloc могут быть использованы. Часто используется трюк: если в памяти заканчивается память, realloc используется для выделения нового пространства для нескольких дополнительных элементов. Таким образом, количество перераспределений уменьшается, потому что realloc считается «дорогой» операцией. В этом случае используются две переменные count: один для размера выделенного массива, другой для числа фактически используемых элементов. Конечно, второе должно всегда быть меньше или равно первому.