Алгоритм для двухмерных ближайших координат

Я знаю, что делаю это неправильно, но не могу придумать правильный способ решить эту проблему. Я работаю с 12 пунктами, перечисленными ниже. (1,2)(1,11)(7,8)(9,9)(12,13),(13,4),(20,8),(22,3),(23,12), (24,14),(26,7),(31,10)

Я делю это на два подмножества

Слева = (1,2)(1,11)(7,8)(9,9)(12,13),(13,4)

Справа=(20,8),(22,3),(23,12),(24,14),(26,7),(31,10)

Дальнейшее сокращение

LСлева=(1,2)(1,11)(7,8)

РЛево=(9,9)(12,13),(13,4)

LRight=(20,8),(22,3),(23,12)

RRRight=(24,14),(26,7),(31,10)

Найдите минимальное расстояние для каждого набора.

LLeft (1,2)(1,11) равно 9, (1,11)(7,8) равно 6,7, (1,2)(7,8) равно 8,48

Мин 6.7

RLeft (9,9)(12,3) равно 6,70, (9,9)(13,4) равно 6,4, (12,3)(13,4) равно 1,14

Мин 1.14

LRight (20,8)(22,3) равно 5,38 (20,8)(23,2) равно 5, (22,3)(23,12) равно 9,05

Мин 5

RRight (24,14)(26,7) равно 7,28 (24,14)(31,10) равно 8,06 (26,7)(31,10) равно 5,83

Мин 5.83

Итак, теперь у меня есть LLeft, RLeft, LRight и RRight. Мне нужно найти LRLeft, RLLEft_Right (значение посередине) и LRRight. Вот где я запутался. Единственный способ получить LRLeft, который я могу придумать, — взять каждую точку в LLeft и RLEft и найти расстояние между ними. Затем используйте это расстояние и сравните его с LLeft и RLeft, и это даст мне кратчайшее расстояние между двумя точками для левой стороны. Затем я делаю то же самое для правой и центральной части. Я почти уверен, что есть более быстрый и лучший способ сделать это, но я не могу понять его.


person Aaron    schedule 22.04.2011    source источник
comment
К сожалению нет. Поиск пары ближайших соседей - это, AFAIK, проблема N ^ 2; каков контекст для желания сделать это? Вы можете найти некоторые из возможных методов (с оговорками), перечисленных здесь: en.wikipedia.org/wiki/Nearest_neighbor_search   -  person J Trana    schedule 23.04.2011
comment
Это не поиск ближайшего соседа. Вы хотите посмотреть: en.wikipedia.org/wiki/   -  person YXD    schedule 23.04.2011
comment
@Mr E, это не должен быть комментарий, это должен быть ответ   -  person Máthé Endre-Botond    schedule 23.04.2011


Ответы (1)


Вы должны взглянуть на http://en.wikipedia.org/wiki/Closest_pair_of_points_problem#Planar_case

Вот лучший ресурс для шага 4, но для начала: В рекурсии, если у нас уже есть минимальные расстояния d1 и d2 в пределах левого и правого наборов соответственно, то if есть более близкая пара точек - где одна слева, а другая справа set - тогда нам нужно только проверить точки на расстоянии d от разделительной линии, где d = min(d1,d2).

person YXD    schedule 24.04.2011
comment
Я сделал, но у меня возникли проблемы с пониманием того, как реализовать шаг 4. Как мне выбрать, какую точку слева от линии сравнивать с точкой справа от линии. - person Aaron; 25.04.2011
comment
Добавил немного информации и еще одну ссылку. Если у меня будет время завтра, и это все еще не работает для вас, я напишу еще немного. - person YXD; 25.04.2011
comment
Отличная ссылка! Сегодня кое-что узнал. - person J Trana; 25.04.2011