основная идея алгоритма заключается в следующем.
У вас есть набор точек P, и вы хотите найти две точки в P, которые имеют наименьшее расстояние между ними.
Aпростой метод грубой силы будет проходить через каждую пару в P, вычислять расстояние, а затем брать одну пару, которая имеет самое короткое расстояние.Это алгоритм O (n²).
Однако лучше по алгоритму, о котором вы говорите.Идея состоит в том, чтобы сначала упорядочить все точки в соответствии с одной из координат, например, координатой x.Теперь ваш набор P на самом деле представляет собой отсортированный список точек, отсортированный по их x-координатам.Алгоритм теперь принимает в качестве входных данных не набор точек, а отсортированный список точек.Давайте назовем алгоритм ClosestPair (L), где L - список точек, заданных в качестве аргумента.
ClosestPair (L) теперь реализован рекурсивно следующим образом:
- Разделить списокL в его середине, получая L влево и L вправо .
- Рекурсивное решение ClosestPair (L left ) и ClosestPair (L право ).Пусть соответствующие кратчайшие расстояния, полученные с помощью δ влево и δ вправо .
- Теперь мы знаем, что кратчайшее расстояние в исходном наборе (представленном L) либо одноиз двух δs, или тогда это расстояние между точкой в L слева и точкой в L справа .
- Se нам еще нужно проверить, есть лиэто более короткое расстояние между двумя точками слева и справа.Хитрость в том, что, поскольку мы знаем, что расстояние должно быть меньше, чем δ влево и δ вправо , достаточно рассмотреть из обоих подразделений точки, которые не дальше чем min (δ * 1040)* влево , δ вправо ) от разделительной линии (координата x, которую вы использовали для разделения исходного списка L).Эта оптимизация делает процедуру быстрее, чем метод грубой силы, на практике O (n log n).