Запросить ближайший диапазон

У меня есть два набора, A и B. Наборы состоят из N точек измерения и упорядочены (N‹10). Мне нужно найти ближайшую часть B к A. Допустим, ближайшая часть - B1. Количество точек в B1 должно быть таким же, как и в A, а сумма расстояний от всех точек в B1 до A должна быть минимальной.

Я проверил k-d дерево. Это только помогает найти ближайшую точку в наборе. Итак, существует ли алгоритм для быстрого поиска ближайшего диапазона?

Спасибо.


person Mark    schedule 05.11.2011    source источник


Ответы (1)


Я полагаю, что вам просто нужен алгоритм поиска n ближайших соседей, который является простым расширением алгоритма ближайшего соседа. Запустите это для каждой точки в наборе A и минимизируйте общую сумму.

Алгоритм упоминается в эта статья ("Вводный курс по kd-деревьям"). Расширение более чем на одного ближайшего соседа упоминается лишь кратко, но должно быть достаточно ясно. Это статья, из которой я успешно реализовал модифицированный алгоритм.

Эталонную реализацию на C# можно найти здесь, она прокомментирована и содержит соответствующие модульные тесты. Должно быть легко адаптироваться к императивному языку по вашему выбору.

person Noldorin    schedule 05.11.2011
comment
Спасибо за Ваш ответ. Но проблема в том, что возвращаемые точки должны быть непрерывными в наборах. Если первая точка B1 равна b6, следующие точки должны быть b7,b8,b9... Результаты возврата KNN не являются непрерывными. - person Mark; 05.11.2011
comment
Непрерывный? Что ты имеешь в виду? Очевидно, вы не используете математическое определение термина, относящегося к бесконечно малым эпсилон-дельта. - person Noldorin; 05.11.2011
comment
Например, A = {a1,a2,a3..am} и B = {b1,b2,b3....,bn}. B1 — это ближайший диапазон к A, и он начинается с b3. Тогда B1 должен быть {b3,b4,b5..b3+m}. Расстояния между B1 и A равны b3->a1, b4->a2, b5->a3...am->b3+m. - person Mark; 05.11.2011