Как найти среднюю позицию между двумя заданными позициями в двумерном массиве - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть двумерный массив, в котором я хочу найти среднюю позицию между двумя заданными позициями: ниже, например, показывает индексы в каждой позиции.

00, 01, 02, 03
10, 11, 12, 13
20, 21, 22, 23
30, 31, 32, 33

Входные данные:

  • Для позиций 23 и 33 я должен получить выходную позицию 31. Здесь входными данными являются iStart, равный 2, и jStart, равный 3, аналогично iEnd, равный 3, и jEnd, равный 3. Ожидаемое значение o / p равно i_mid = 3 и j_mid = 1

  • Для позиции 00 и 22 Я должен получить выходную позицию 11. Здесь входные значения iStart равны 0, а jStart также равны 0, аналогично iEnd и jEnd равны 1 Ожидаемое значение o / p равно i_mid = 1 и j_mid = 1

  • Для позиции 02 и 23 Я должен получить выходную позицию 12. Здесь входными данными являются iStart, равный 0, и jStart, равный 2, аналогично iEnd, равный 2, и jEnd, равный 3. Ожидаемое значение o / p равно i_mid = 1 и j_mid = 2

  • Для позиции 10 и 31 Я должен получить выходную позицию 20. Здесь входными данными являются iStart, равный 3, и jStart, равный 1, аналогично iEnd, равный 3, и jEnd, равный 1. Ожидаемое значение o / p равно i_mid = 2 и j_mid = 0

. знать длину массива как матрицу n x m, ie. максимальное значение i может go составляет n, а максимальное значение j может go составляет m. поэтому для n x m массива iMax будет n и jMax будет m

Теперь функция может быть представлена ​​как:

void getMiddle(int iStart, int jStart, int iEnd, int jEnd, int iMax, int jMax) {


 //We need to find the mid_i and mid_j of the input positions
 System.out.println("midd_i = "+ mid_i +" and midd_j = "+mid_j);
}

Я решил это методом грубой силы, однако я ищу оптимальное решение.

В моем подходе сначала я нахожу количество элементов, которые могут находиться между данной позицией, а затем я разделил число элемента на 2 и пересекают положение до половины элементов, которые могут прийти, поскольку эта точка будет серединой, мое решение следующее:

void getMiddle(int iStart, int jStart, int iEnd, int jEnd, int jMax) {
   int numberOfRows = (iEnd - iStart) + 1;
   int totalElementsInRows = jMax * numberOfRows;
   int eliminateStartElements = jStart;
   int eliminateEndElements = (jMax - 1) - jEnd;
   int totalElementsPresentBetweenPositions = totalElementsInRows - (eliminateStartElements + eliminateEndElements);
   int halfElement = totalElementsPresentBetweenPositions/2;
   int countElement = 0;
   for(int i = iStart; i<= iEnd; i++) {
      for(int j = 0; j< jMax; j++) {
        countElement++;
        if(halfElement == countElement) {
          System.out.println("midd_i = "+ i +" and midd_j = "+j);
          break;
        }
      }
  }
}

Я уверен, что должно быть оптимальное решение, Если у кого-нибудь есть оптимальное решение, помогите.

Ответы [ 3 ]

1 голос
/ 04 апреля 2020

Это неправильный подход, пожалуйста, смотрите раздел комментариев ниже.

//////////////////////////////

Вы можете найти среднее между точками. Если у вас есть точка A и точка B. Программа должна вычислять среднее значение в двух измерениях: x=(Ax + Bx)/2. Аналогично по оси Y.

Вам не нужно беспокоиться о том, что .5 добавляется в конец числа, потому что Java обрежет его для вас.

0 голосов
/ 04 апреля 2020

Вы можете упростить задачу, представив конкретные числа в соответствующих позициях вместо индексов, которые варьируются от 0 to n x m - 1. Что-то вроде:

 0,  1,  2,  3
 4,  5,  6,  7
 8,  9, 10, 11
12, 13, 14, 15

Тогда для каждого элемента в m [i] [j] применяется

m[i][j] = i * m[i].length + j

и для каждого k, 0 <= k < n x m

 i = k / m
 j = k % m

который в вашем методе выглядит следующим образом:

static void getMiddle(int iStart, int jStart, int iEnd, int jEnd, int iMax, int jMax) {
    int s = iStart * jMax + jStart;
    int e = iEnd * jMax + jEnd;
    int mid_i = ((e+s)/2)/jMax;
    int mid_j = ((e+s)/2)%jMax;
    System.out.println("midd_i = "+ mid_i +" and midd_j = "+mid_j);
}

Примечание. Я не проверяю допустимые входные данные, например, если iStart <= iEnd <= iMax

Проверьте результаты с вашим примером ввода:

getMiddle(0, 0, 2, 2, 4, 4);
getMiddle(0, 2, 2, 3, 4, 4);
getMiddle(1, 0, 3, 1, 4, 4);

midd_i = 1 and midd_j = 1
midd_i = 1 and midd_j = 2
midd_i = 2 and midd_j = 0
0 голосов
/ 04 апреля 2020

Должен быть способ сделать это с геометрией c подход ...

Найдите среднюю точку между двумя, которые вы хотите получить, поэтому, если вы хотите найти положение между матом [0 ] [0] и mat [2] [2], вы найдете средние точки:

mid = (Math.abs (x1 - x2) / 2, Math.abs (y1 - y2) / 2)

x = (2 - 0) / 2 = 1 y = (2 - 0) / 2 = 1

, поэтому ответ будет мат [1] [1]

если бы это был менее простой пример, такой как mat [0] [2] и mat [3] [3]:

, мы сначала находим среднюю точку, такую ​​как:

x = (3 - 0) / 2 = 1,5 года = (3 - 2) / 2 = 0,5

округлите ответы до ближайшего целого числа, чтобы получить правильные индексы

...