Найближча пара точок

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
Найближча пара зафарбована в червоний колір

Задача пошуку найближчої пари точок належить до задач обчислювальної геометрії: дано n точок в метричному просторі, знайти пару точок з найменшою відстанню між ними. Задача найближчої пари точок в евклідовій площині[1] була однією з перших геометричних задач, яка вирішувалась на початку систематичного вивчення обчислювальної складності геометричних алгоритмів.

«Наївний» алгоритм полягає в знаходженні відстаней між усіма парами точок в просторі даної розмірності і виборі мінімальної, це вимагає часу. Виявляється, що ця проблема може бути вирішена за часу в Евклідовому просторі або просторі Lp фіксованої розмірності d[2]. В алгебраїчному дереві рішень моделі обчислень, алгоритм складності є оптимальним. В обчислювальній моделі, яка передбачає, що функція знаходить результат за постійний час, кажуть, що проблема може бути вирішена за часу[3]. Якщо допускається рандомізація, з використання функції підлоги, то проблема може бути вирішена за часу[4][5].

Алгоритм перебору[ред. | ред. код]

Найближча пара точок може бути знайдена за час O(n2) з допомогою пошуку грубою силою. Щоб зробити це, можна обчислити відстані між усіма парами точок, потім вибрати пару з найменшою відстанню, як показано нижче.

minDist = infinity
for i = 1 to length(P) - 1
 for j = i + 1 to length(P)
  let p = P[i], q = P[j]
  if dist(p, q) < minDist:
   minDist = dist(p, q)
   closestPair = (p, q)
return closestPair

Планарний випадок[ред. | ред. код]

Розділяй та володарюй: усічена смуга для перевірки

Проблема може бути вирішена за часу, використовуючи рекурсивний підхід розділяй і володарюй, наприклад, наступним чином:

  1. Сортування точок відповідно до їх x-координат.
  2. Поділ множини точок на два рівні за розміром підмножини по вертикальній лінії .
  3. Вирішити цю проблему рекурсивно в лівій і правій підмножині.
  4. Знайти мінімальну відстань серед множини пар точок, в яких одна точка лежить ліворуч від ділення по вертикалі, а інша точка праворуч.
  5. Відповідь є мінімальним серед , та .

Виявляється, що 4-ий крок може бути виконаний за лінійний час. Знову ж, наївний підхід вимагає розрахунок відстаней для всіх пар зліва на право, тобто за квадратичний час. Ключове спостереження засноване на властивості розрідженості множини точок. Ми вже знаємо, що найближча пара точок не далі ніж . Таким чином, для кожної точки p ліворуч від розділової лінії, необхідно порівняти відстань до точки, які лежать у прямокутнику розмірів праворуч від розділової лінії, як показано на малюнку. Більш того, цей прямокутник може містити не більше шести точок з попарних відстаней принаймні . Таким чином, досить обчислити максимально 6n зліва направо відстаней на 4-му кроці. Рекурентне співвідношення для числа кроків може бути записане у вигляді , яке можна вирішити, використовуючи майстер-метод, щоб отримати .

Оскільки найближча пара точок визначає край у тріангуляції Делоне, і відповідає двом сусіднім коміркам на діаграмі Вороного, то найближча пара точок може бути визначена за лінійний час у разі використання однієї з цих структур. Обчислення чи то тріангуляції Делоне, чи діаграми Вороного займає часу. Ці підходи не є ефективними для розмірності , тоді як алгоритм розділяй і володарюй можна узагальнити і він буде виконуватись за час для будь-якого сталого значення d[джерело?].

Динамічна задача знаходження пари найближчих точок[ред. | ред. код]

Динамічна задача знаходження пари найближчих точок формулюється так:

  • Для динамічної множини об'єктів, знайти алгоритми і структури даних для ефективного перерахунку найближчої пари об'єктів щоразу, коли об'єкти додаються або видаляються.

Див. також[ред. | ред. код]

Посилання[ред. | ред. код]

  • Кормен, Томас; Лейзерсон, Чарльз; Рівест, Рональд; Стайн, Кліфорд (2019). 34.4: Пошук найближчої пари точок. Вступ до алгоритмів (вид. 3). К.І.С. с. 1042—1047. ISBN 978-617-684-239-2. {{cite book}}: Cite має пустий невідомий параметр: |1= (довідка)
  • Jon Kleinberg; Éva Tardos (2006). Algorithm Design. Addison Wesley.
  • UCSB Lecture Notes
  • rosettacode.org — Closest pair of points implemented in multiple programming languages
  • Line sweep algorithm for the closest pair problem

Примітки[ред. | ред. код]

  1. Шеймос, Майкл; Хой, Ден (1975). Closest-point problems. 16-й річний симпозіум у Фонді комп'ютерних наук IEEE. с. 151—162. doi:10.1109/SFCS.1975.8. Архів оригіналу за 18 травня 2015. Процитовано 30 травня 2017.
  2. Кларксон, К. Л. (1983). Fast algorithms for the all nearest neighbors problem. FOCS.
  3. Фортуна, С.; Гопкрофт, Дж. Є. (1979). A note on Rabin's nearest-neighbor algorithm. Information Processing Letters. 8 (1): 20—23.
  4. Хуллер, С.; Матіас, І. (1995). A simple randomized sieve algorithm for the closest-pair problem. Inf. Comput. 118 (1): 34—37.
  5. Ліптон, Річард (24 вересня 2011). Rabin Flips a Coin. Архів оригіналу за 16 лютого 2019. Процитовано 30 травня 2017.