Сортування за евклідовою дистанцією


17

S - це сукупність точок на площині. Наодній площині задаєтьсявипадкова точкаxSЗавдання полягає в сортуванні всіхyS по евклідовій відстані міжx іy .

Немозковий підхід - це обчислити відстані між x і y для всіх yS а потім сортувати їх за допомогою будь-якого швидкого алгоритму.

Чи є спосіб зберігання або попередньої обробки S щоб процес сортування став швидшим?


1
Ви можете розглянути сітку відповідного розміру та групу точок за відповідним квадратом (використовуючи, скажімо, хеш-таблицю). Тоді для певних пар квадратів можна зробити висновок, що всі точки з одного квадрата далекі від ніж усі точки з іншого квадрата. На практиці це могло б допомогти, я думаю. x
ilyaraz

"Немозковий підхід", про який ви заявили, працює за O (n log n) час, де n - кількість балів у S, що, напевно, є досить швидким на практиці. Ви хочете відхилити коефіцієнт журналу n чи вам потрібно щось інше, наприклад, зовнішнє сортування ?
Tsuyoshi Ito

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

Наприклад, якщо я зберігаю S як 2-d-дерево, я можу знайти одного найближчого сусіда за час O (log n). Можливо, є подібне рішення для мого завдання. Я не великий експерт у структурі просторових даних - і їх так багато - я міг легко пропустити це.
Алекс К.

Відповіді:


13

Розв’язання 1: Знайдіть перпендикулярні бісектриси між парами точок і побудуйте розташування цих прямих. У розташуванні є Θ ( n 4 ) комірок, усередині яких відсортований порядок є постійним. Отже, побудуйте структуру даних про розташування точок для розташування та прикрасьте кожну комірку відсортованим порядком, який потрібно повернути для точок у цій комірці. Відсортовані порядки між сусідніми клітинками відрізняються лише одним транспозицією, тому ви можете використовувати стійку структуру даних, щоб дозволити представленням цих відсортованих порядків ділити простір. Загальний простір - O ( n 4 ), а час запиту - OΘ(n2)Θ(n4)O(n4) .O(logn)

Рішення 2: Виберіть випадковий зразок цих самих перпендикулярних бісектрис, побудуйте їх розташування та розділіть кожну комірку розташування по вертикальних відрізках ліній через кожне перетинання двох вибіркових ліній. Отриманий розділ має Θ ( n 2 ) комірок, кожна з яких з великою часткою ймовірності перетинається через O ( n ) без вибірки бісектриси. Прикрасьте кожну комірку розділу за допомогою дійсного упорядкованого упорядкування точок, переглянутих із деякого x у комірці. Загальний простір дорівнює O ( n 3 ) .Θ(n)Θ(n2)O(n)O(n3)

Тепер, щоб зробити запит, знайдіть точку запиту в розділі, знайдіть впорядкованість, що зберігається в комірці розділу, та використовуйте алгоритм сортування декартового дерева порівняння Levcopoulos & Petersson (1989), починаючи з цього збереженого замовлення. Час для цього кроку пропорційне де k i - кількість точок, які не відповідають порядку з точкою y i . Але k i - O ( n ) (кожен нерозбірний бісектриса викликає щонайменше одну пару точок поза порядком), тому час запитуiO(1+logki)kiyikiO(n) також є O ( n ) .iO(1+logki)O(n)


1
PS ось альтернативний варіант рішення 2, який використовує той самий простір та час запиту, але торгує складнішим алгоритмом попередньої обробки для більш простого алгоритму запиту: 11011110.livejournal.com/233793.html
Девід

Чому попередня обробка, коли ви могли сортувати з усіх n вихідних точок за час O ( n 2 log n ) та зберігати результати у хеш-таблиці, використовуючи простір O ( n 2 ) для постійного пошуку? n4nO(n2logn)O(n2)
Дейв

Оскільки є вихідні точки з різними порядками сортування, а не Θ ( n 2 ) . Θ(n4)Θ(n2)
Девід Еппштейн

1

Ви, мабуть, не зможете піти з часу будь-яким способом, коли ви його нарізаєте; Навіть попередньо обчислювальні регіони, відповідні всім можливим замовленням на сортування, можуть (я вважаю) дають O ( n ! ) регіони, і таким чином пошук "вашого" регіону будь-якою значущою технікою пошуку займе O ( log ( n ! ) ) = O ( n log ( n ) ) час. ( EDIT:nlog(n)O(n!)O(log(n!))=O(nlog(n))це абсолютно неправильно; див. відмінну відповідь Девіда Еппштейна для отримання додаткової інформації!) Один корисний спосіб зменшити складність, з іншого боку - особливо якщо вам не потрібен повний сорт одразу, а просто потрібно мати можливість випадковим чином витягнути -найближче на льоту - може бути через більш високого порядку діаграм Вороного: розширення стандартної комірки Вороного , що вмістити не тільки найближчий сусід , але другий найближчими, папір і т.д. Франк Dehne на к-найближчих сусідів пошуку, HTTP: //people.scs .carleton.ca / ~ dehne / публікації / 2-02.pdf, здається, є канонічним посиланням; його домашня сторінка за адресою http://www.dehne.carleton.ca/publications містить ряд інших робіт про діаграми Вороного, які можуть бути корисними.k


3
Якщо розділити площину на регіони з різними порядками сортування, є регіони, а не O ( n ! ) . Межі між областями - це перпендикулярні бісектрисні лінії пар точок, є Θ ( n 2 ) таких прямих, а набір областей задається розташуванням цих прямих. Θ(n4)O(n!)Θ(n2)
Девід Еппштейн

@David Я думаю, що ти повинен відповісти на це.
Джеймс Кінг

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