Измерение расстояния между двумя наборами возможно разных размеров - PullRequest
5 голосов
/ 14 декабря 2010

У меня есть 2 набора целых чисел, A и B, не обязательно одинакового размера.Для моих нужд я принимаю расстояние между каждыми 2 элементами a и b (целые числа) равным abs(a-b).

Я определяю расстояние между двумя наборами следующим образом:

  1. Если наборы имеют одинаковый размер, минимизируйте сумму расстояний всех пар [a, b] (a от A и b от B), минимизацию по всем возможным «парам разделов» (существует n! Возможных разделов).
  2. Если наборы не имеют одинаковый размер, скажем, A размера m и B размера n с m

Мой вопрос заключается в следующем: следующий алгоритм (просто интуитивное предположение) дает правильный ответ, согласно приведенному выше определению.

  • Построить матрицуD размера m X n, с D(i,j) = abs(A(i)-B(j))
  • Найдите наименьший элемент D, накопите его и удалите строку и столбец этого элемента.Накопите следующую наименьшую запись и продолжайте накапливать до тех пор, пока не будут удалены все строки и столбцы. Например,

, если A={0,1,4} и B={3,4}, то D равно (с элементами выше ислева):

3 4

0 3 4

1 2 3

4 1 0

А расстояние составляет 0 + 2 = 2, исходя из спаривания 4 с 4 и 3 с 1.

Ответы [ 4 ]

5 голосов
/ 14 декабря 2010

Обратите внимание, что эту проблему иногда называют проблемой лыж и лыжников, когда у вас есть n лыж и m лыжников различной длины и высоты. Цель состоит в том, чтобы сопоставить лыжи с лыжниками так, чтобы сумма различий между высотой и длиной лыж сводилась к минимуму.

Чтобы решить эту проблему, вы можете использовать двустороннее сопоставление минимального веса, которое требует времени O (n ^ 3).

Еще лучше, вы можете достичь O (n ^ 2) времени с O (n) дополнительной памятью, используя простой алгоритм динамического программирования ниже.

Оптимально, вы можете решить проблему за линейное время, если точки уже отсортированы, используя алгоритм, описанный в этой статье .

O (n ^ 2) алгоритм динамического программирования:

if (size(B) > size(A))
  swap(A, B);
sort(A);
sort(B);
opt = array(size(B));
nopt = array(size(B));
for (i = 0; i < size(B); i++)
  opt[i] = abs(A[0] - B[i]);
for (i = 1; i < size(A); i++) {
  fill(nopt, infinity);
  for (j = 1; j < size(B); j++) {
    nopt[j] = min(nopt[j - 1], opt[j - 1] + abs(A[i] - B[j]));
  swap(opt, nopt);
}
return opt[size(B) - 1];

После каждой итерации i внешнего цикла for, указанного выше, opt[j] содержит оптимальное решение, соответствующее {A[0],..., A[i]} с использованием элементов {B[0],..., B[j]}.

Правильность этого алгоритма основывается на том факте, что при любом оптимальном сопоставлении, если a1 сопоставляется с b1, a2 сопоставляется с b2 и a1

2 голосов
/ 14 декабря 2010

Чтобы получить оптимальное значение, решите задачу назначения на D.

Задача назначения находит идеальное соответствие в двудольном графе, так что общий вес ребра минимизируется, что идеально соответствует вашей задаче. Так же в П.

РЕДАКТИРОВАТЬ , чтобы объяснить, как проблема ОП отображается в назначении.

Для простоты объяснения расширить меньший набор специальными элементами e_k.

Пусть A - набор рабочих, а B - набор задач (содержимое - просто метки).

Пусть стоимость будет расстоянием между элементом в A и B (то есть запись в D). Расстояние между e_k и чем-либо равно 0.

Затем мы хотим найти идеальное соответствие A и B (т. Е. Каждый работник соответствует задаче), так что стоимость будет минимизирована. Это является проблемой назначения.

1 голос
/ 14 декабря 2010

Нет. Это не лучший ответ, например: A: {3,7} и B: {0,4} вы выберете: {(3,4), (0,7)} и расстояние равно 8, но вы должны выбрать {(3,0), (4,7)} , в этом случае расстояние равно 6.

0 голосов
/ 14 декабря 2010

Ваш ответ дает хорошее приближение к минимуму, но не обязательно лучший минимум.Вы придерживаетесь «жадного» подхода, который обычно намного проще и дает хорошие результаты, но не может гарантировать лучший ответ.

...