Найкоротша відстань між точкою в A і точкою в B


9

Дано два набори A і B кожен з яких містить n розрізнені точки в площині, обчисліть найменшу відстань між точкою в A і крапка в B, тобто min { dist(p,q) | pAqB }.

Я не впевнений, чи маю рацію, але ця проблема дуже схожа на проблеми, які можна вирішити лінійним програмуванням в обчислювальній геометрії. Однак зниження до LP не є простим. Також моя проблема виглядає пов'язаною з пошуком найтоншого зазору між двома наборами точок, які, очевидно, можуть бути вирішені LP в у двовимірному просторі.O(n)


4
У чому тут питання?
Рафаель


Я не фахівець, але, як правило, в машинному навчанні, де ці моменти є даними, множини добре поводяться більшу частину часу і групуються, тому алгоритми, подібні до запропонованого @Pedro, добре працюють.
chazisop

3
"що, очевидно, може бути вирішено LP в O (n) у двовимірному просторі" - мені цікаво, що спонукало це твердження. "Лінійне програмування" взагалі не вирішується за лінійним часом; "лінійний" відноситься до чогось іншого. Так чи має ЛП особливу форму?
Рафаель

Відповіді:


5

У мене є рішення, яке може здатися трохи заплутаним, але повинно бути більш ефективним, ніж пошук наївного грубої сили:O(n2)

  1. нехай буде вісь між центрами мас і .vAB
  2. Сортуйте точки і уздовж цієї осі у порядку зменшення та зростання відповідно, у результаті виходять послідовності , , ..., та , , ..., .ABa0a1anb0b1bn

Решта - у псевдо-коді, щоб зробити це зрозумілішим:

d = infinity.
for j from 1 to n
    if (b_1 - a_j) along v > d then break endif
    for k from 1 to n
        if (b_k - a_j) along v > d then
            break
        else
            d = min( d , ||b_k - a_j|| )
        endif
    enddo
enddo

Тобто, попередньо сортувавши точки вздовж , ви можете відфільтрувати пари, які ніколи не будуть знаходитись у одна від одної, оскільки вздовж завжди буде.vdbkajvbkaj

У гіршому випадку це все-таки , але якщо і добре розділені, це повинно бути набагато швидше, ніж це, але не краще, ніж , що потрібно для сортування.O(n2)ABO(nlogn)

Оновлення

Це рішення ні в якому разі не витягується з шапки. Це особливий випадок того, що я використовую в моделюванні частинок, щоб знайти всі взаємодіючі пари частинок з просторовим бінінгу. Моя власна робота, що пояснює більш загальну проблему, тут .

Що стосується пропозиції використовувати модифікований алгоритм розгортки ліній, хоча інтуїтивно зрозумілий простий, я не переконаний, що це в коли розглядаються суміжні набори. Те саме стосується і рандомізованого алгоритму Рабіна.O(nlogn)

Здається, не так багато літератури, яка займається найближчою парою проблеми в нерозбірливих множинах, але я знайшов це , що не вимагає, щоб бути під , і це , що не здається робити будь-які претензії щодо чого-небудь.O(n2)

Вищенаведений алгоритм можна розглядати як варіант зміщення площини, запропонований у першій статті (Шань, Чжан та Зальцберг), але замість використання -осі та не сортування, використовується вісь між множинами, а множини проходять у порядку зменшення / зростання.x


2
@Pedro: Вибачте, що я не коментував раніше (часу не було). Причиною я відмовився від вашої відповіді, тому що це була погана відповідь і не повинна була бути на вершині. Це насправді добре відома проблема обчислювальної геометрії з гіршим випадком O (n log n). Хороша відповідь вказувала б на відому проблему (можливо, з посиланням) та поширені рішення, які включають: використання дерев kd та тестування елементів, алгоритми розгортання тощо. Загальною ідеєю має бути попередня обробка в упорядкованій структурі та використання цього . Подивіться на 1D випадок - більш очевидний O (n log n) там.
ex0du5

2
@ ex0du5: Це звучить так, ніби ви повинні написати свою відповідь! Зауважте, що "є краща відповідь", як правило, не є вагомою причиною для відмови; цей захід має бути зарезервований для помилкових, спам і дуже неправильно відформатованих відповідей. Педро - це не те. Дивіться також тут, щоб отримати враження, скільки думок, які деякі люди думають, слід дати перед головою.
Рафаель

1
@Raphael: Я не відповів, бо була одна справедлива відповідь, і я не встиг шукати посилання. Що стосується вашої довідки про те, як зняти участь, це жахливий алгоритм для цих сайтів! Студенти CS повинні особливо розуміти важливість не втратити мету для формалізму. Мета голосування - перенести відповіді до рейтингу, який спрямовуватиме пізніх учнів цієї ж проблеми до найбільш корисних відповідей. Мій алгоритм голосування робить це. Та альго: явно ні. Це можна обговорити на мета, якщо вам подобається, але, як дорослі, ми повинні використовувати свої сили для добра, я думаю.
ex0du5

1
@ ex0du5: Ви, здається, зараз у вас є певний час. Чи можете ви насправді показати, що цей екземпляр насправді є «добре відомою проблемою з гіршим випадком »? O(nlogn)
Педро

1
@ ex0du5: Насправді, пошук найближчого сусіда, наприклад, з використанням дерев kd , має лише середню складність O (logn) . Отже, ми повернулися до квадратного.
Педро

4

Ви можете адаптувати алгоритм підмітання рядків "найближчої пари" , який є .O(nlogn)

Єдина зміна, яку вам доведеться зробити - це ігнорувати пари, що належать до одного набору.

Правка: насправді це не просто (або навіть можливо), як я описав. Дивіться коментарі для обговорення.


2
Лише зауваження, можна також адаптувати класичний алгоритм ділення та підкорення для найближчих пар, який також працює в ; див. також Вікіпедію . O(nlogn)
rizwanhudda

1
Для рандомізованого алгоритму лінійного часу див., Наприклад, Рабін гортає монету в блозі Ліптона.
Джухо

3
Не могли б ви бути трохи більш конкретними щодо того, як ви реалізуєте це для непересічних наборів, особливо що стосується збереження ? O(nlogn)
Педро

-1 за некоректність. Алгоритм підчинення найближчих парних рядків, на який ви посилаєтеся, покладається на відсортований набір, що містить елементи , але у випадку неперервних наборів цей набір починається з елементів, тому його більше немає в , принаймні, не в гіршому випадку. O(1)nO(nlogn)
Педро

1
@Pedro: Чому він буде більшим? Якщо що-небудь, то кількість поточних кандидатських балів має зменшитися.
Рафаель

4

Ідея подібних проблем полягає у створенні впорядкованої структури з одного з наборів, що дозволяє виконувати ефективні запити найближчого сусіда. Класична папір, яка представляла структуру запитів O (log n) для довільного виміру:

Шамос і Хой на рішеннях Вороного

З тих пір створено ряд інших космічних розділів, заснованих на ідеях тесселяцій Делані, які також перекладаються на різні описи підпростору. Зауважимо, що метод Вороного також підпадає під загальний опис розділення та перемоги завдяки його плоскому поділу, який робить етап побудови O (n log n).

Отже, основне рішення цієї проблеми:

  1. Візьміть набір A і побудуйте ефективну структуру запитів найближчих сусідів на ваш вибір. Цей крок побудови - O (n log n) [див. Теорему 4].
  2. Для кожного елемента в B запитуйте структуру запиту A для найближчого сусіда. Кожен запит - O (log n) [див. Теорему 15, фіксований розмір], тому загальний час запиту для всіх точок у B дорівнює O (n log n).
  3. Коли буде отриманий результат для найближчої точки A до кожного B, покладіть його в структуру, упорядковану на відстані. Це O (log n) вставити кожен результат, або O (n log n) для всіх.
  4. Коли всі B були розглянуті, ви можете швидко (O (1)) отримати точку B в упорядкованій структурі з найменшою відстані сусіда до точки в А.

Як видно, дивлячись на складність кожного кроку, загальна складність становить O (n log n). Для сучасного читача, який не дивиться на класичні статті, це висвітлено у багатьох книгах алгоритмів, наприклад, "Керівництво по проектуванню алгоритму" Скіени.


1
"Рішення Artium, наприклад, може бути записане у цій формі і є повністю дійсним." - ну, що ви пропонуєте тут, це вже не чистий алгоритм розгортки ліній, тому я не знаю про це.
Рафаель

@Raphael: Звичайно, це так. Алгоритми Sweepline попередньо обробляють точки в упорядкованій структурі так само, як описано тут. Я навіть пов’язав Алгоритм Фортуна під його відповіддю, який показує, що алгоритм розгортки є лише екземпляром алгоритму Вороного. Причиною, що я зберігав рішення, загальне для структури запитів, є те, що існує велика кількість геометричних механізмів, розроблених для цього.
ex0du5

Вам не потрібен конкретний порядок під час ітерації над , тоді як порядок є важливим для (багатьох / всіх?) Алгоритмів прохідної лінії (звідси, напевно, назва). B
Рафаель

1

Я не впевнений, чи маю рацію, але ця проблема дуже схожа на проблеми, які можна вирішити лінійним програмуванням в обчислювальній геометрії. Однак зниження до LP не є простим. Також моя проблема виглядає пов'язаною з пошуком найтоншого зазору між двома наборами точок, які, очевидно, можуть бути вирішені LP в двовимірному просторі.

Нижньою межею для цієї задачі є в алгебраїчній моделі рішень. Я наведу тут грубі замальовки його доказів.O(nlogn)

Ми зведемо примірник розрізнення елемента Е до С.

  • Вхід до E: S={a1,a2,a3,...,an}
  • Нехай > 0 є невеликим дробомϵ
  • A = ,{(ai,0):1in}B={(ai+ϵ):1in}
  • Тепер, якщо ми зможемо знайти найменшу відстань (d) між множинами A і B. Ми можемо вирішити задачу розрізнення елементів у додатковий час наступним чином O(n)
    • Набір має дублікат, якщо і лише тоді, коли d =Sϵ

Ми знаємо, що нижня межа часу виконання для вирішення проблеми розрізнення елементів - це . Отже, шляхом зменшення нижня межа стосується і нашої проблеми.O(nlogn)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.