Это обобщение Как сравнить каждый элемент в двух массивах с временной сложностью меньше, чем O (n ^ 2) . Скажем, у нас есть две матрицы A и B размером nxk и mxk, адресуемые как A[row][col]
и B[row][col]
. Пусть пара (i, j)
будет приемлемой, если для каждого r
, A[i][r] >= B[j][r]
. Есть ли способ определить каждую приемлемую пару быстрее, чем наивный O (nmk)
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
bool accept = true;
for (int r = 0; r < k && accept; ++r) {
accept &= (A[i][r] >= B[j][r]);
}
if (accept) { std::cout << i << ", " << j << "\n"; }
}
}
Если k = 1, тогда я могу использовать решение, вытекающее из связанного вопроса, чтобы выполнить задачу за n log n раз. Однако, когда k> 1, это становится более сложным из-за таких матриц:
A[0] = {1, 1}
A[1] = {3, 1}
A[2] = {3, 5}
A[3] = {5, 3}
A[4] = {5, 5}
B[0] = {2, 4}
B[1] = {4, 2}
Допустимые пары: (2, 0), (4, 0), (3, 1) и (4, 1). Сортировка по первому элементу дает порядок выше, где то, что приемлемо для B = 1, является смежным (A = 3 и A = 4), но то, что приемлемо для B = 0, нет. Сортировка по второму элементу аналогичным образом делает то, что приемлемо для B = 0, смежным, а то, что приемлемо для B = 1, нет. Выполнение одного прохода сортировки и считывания смежных диапазонов, например, решение k = 1, похоже, не работает.
Конкретный параметр, который я имею в виду для этой проблемы, имеет n и m порядка миллионов, а k порядка тысячи, поэтому время nmk не очень практично.