Чому б коли-небудь використовувати Окрем над деревом KD?


32

Я маю певний досвід наукових обчислень і широко використовував kd-дерева для програм BSP (бінарний простір). Нещодавно я ознайомився з октрисами, подібною структурою даних для розділення 3-D евклідових просторів, але такою, яка працює з певними регулярними інтервалами, з того, що я збираю.

Трохи дослідження незалежності, схоже, вказують на те, що kd-дерева, як правило, перевершують продуктивність для більшості наборів даних - швидше будувати та запитувати. Моє запитання: які переваги октрисів у просторовому / часовому виконанні чи в іншому випадку, і в яких ситуаціях вони найбільш застосовні (я чув програмування 3D графіки)? Підсумок переваг та проблем обох типів мені найбільше вдячний.

Крім того, якщо хтось міг би детальніше розглянути питання про використання даних даних R-дерева та його переваги, я також буду вдячний за це. R-дерева (більше, ніж октриси), схоже, застосовуються аналогічно kd-деревам для k-найближчого сусіда або пошуку діапазону.


Слід зазначити, що і kd-дерева, і R-дерева (але не октриси) здаються спеціально розробленими для полегшення пошуку k-найближчого сусіда - як вони порівнюються в цьому сенсі?
Нолдорін

Одна примітка полягає в тому, що kd-дерева мають гарантовану малу глибину. Стислі квадрати можуть потрапити туди, але вони менш зручні.
Суреш Венкат

@Suresh Venkat: Дякую за це. Мені не знайомі стислі квадри, але чи справді вони підходять для 3-D просторових повторів? Можливо, є аналог «стисненої октриси».
Нолдорін

Я також чув, що октриси є більш підходящими, коли є відома крива Z-порядку (заповнення простором), але я не зовсім впевнений у своїх міркуваннях.
Нолдорін

Відповіді:


23

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

ϵqdd(1+ϵ)d1/ϵd1kD

kD


4
Дивіться нещодавній підручник Саріела Хар-Пеледа про сучасний підсумок стислих квадри.
Jeffε

Дякую за хороший кількісний підсумок, Девід. Просто для підтвердження: чи є ваше використання "співвідношення сторін" синонімом "коефіцієнта розгалуження"? Мені обов'язково доведеться перевірити пропущені квадри / октриси, а також стислі квадри / октриси, можливо.
Нолдорін

1
Співвідношення сторін прямокутної коробки можна визначити як відношення її найдовшої довжини краю до найкоротшої довжини краю. Я не знаю, що має означати співвідношення гілок у цьому контексті, але співвідношення сторін не пов'язане з фактором розгалуження дерев (що є постійним для обох структур даних).
Девід Еппштейн

Я пропустив "комірки в". Має сенс зараз.
Нолдорін

15

Група друзів і я працюємо над грою на космічній RTS як веселий бічний проект. Ми використовуємо багато речей, які ми навчились у «Комп’ютерних науках», щоб зробити його високоефективним, що дасть нам змогу згодом скласти масивні армії.

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


Ага так, я теж чув це раніше. Вставка / видалення з kd-дерев - це дорога операція (через повторне врівноваження). Я вважаю, що складні часові складності все ж залишаються однаковими ...
Нолдорін

2
Це залежить від того, як ви вирішите виправити kd-дерево. Хороша складна часова складність - це не те, до чого я, як правило, прагну: наприклад, Богоссорт має складність у найкращому випадку O (1), але, сподіваюся, ніхто не використовує його.
Алекс десять Бринк

На жаль, я не можу знайти хороших підсумків часових складностей для загальних операцій над цими структурами даних, але не пам’ятати. Частота складності в середньому випадку часто прониклива ...
Нолдорін

1
Я дійсно думаю, що вам все-таки краще, якби ви просто використовували KD-дерево, яке крутило осі та просто розділило простір в середині. Пропустіть об'ємний SAH та інші дорогі середні скорочення, і ви отримаєте щось, що не тільки шукає швидше, ніж октрей, але й будує швидше. Оскільки ви розподіляєте простір рівномірно, як і в октрисі, але з двійковим деревом, а не 8-арним деревом, все, що ви робили раніше для видалення, не повинно бути складніше з деревом KD, як це Будемо рівномірно розташовані аналогічно. Наприклад: ви можете просто видалити порожні вузли за глибиною N.
Драконова енергія

8

які переваги октрисів у просторовому / часовому виконанні чи в іншому випадку, і в яких ситуаціях вони найбільш застосовні (я чув програмування 3D графіки)?

kD-дерева є збалансованими двійковими деревами, а octrees є спробами, тому переваги та недоліки, ймовірно, успадковуються із тих більш загальних структур даних. Конкретно:

  • Перебалансування може бути дорогим (октрейсам не потрібно перебалансування).
  • Врівноваження справляється з неоднорідністю краще, оскільки воно адаптивне.
  • Більш високий коефіцієнт гіллястості в октрисах означає дрібніші дерева (менша кількість непрямих та виділень) для однорідних розподілів.

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

EDIT

Мабуть, мої посилання на спроби та однорідність потребують уточнення.

Спроби - це сімейство структур даних, представлених деревами словників, і вони використовуються як словники для ключів, що є послідовностями (найбільш помітними рядками, але також послідовностями ДНК та бітами в хеш-значенні для хеш-спроб). Якщо кожен словник відображає по одному біту кожної з координат x, y і z (найзначніший біт на першому рівні трійки, наступний значущий біт на другому рівні тощо), то трие - це октрис, який рівномірно розподіляє тривимірний простір. Отже, октриси успадковують характеристики спроб, які, як правило:

  • Високий коефіцієнт гіллястості може означати неглибокі дерева, які мають декілька непрямих напрямків, тому пошук швидкий, наприклад, 20 рівнів бінарного дерева можуть бути збережені в 4 рівнях дерева з коефіцієнтом розгалуження 256.
  • Проби не врівноважуються під час вставки та видалення, економлячи дорогу операцію, необхідну для врівноважених бінарних дерев.

Недоліком є ​​те, що неоднорідність може призвести до незбалансованих спроб / октрей, тому пошук може вимагати багатьох непрямих. Еквівалентна задача в спробах вирішується за допомогою стиснення краю для згортання декількох рівнів непрямості на єдиний рівень. Octrees цього не роблять, але ніщо не заважає вам стискати octree (але я не думаю, що ви могли б назвати результат octree!).

Для порівняння розглянемо спеціалізований словник для рядкових ключів, який представлений у вигляді трие. Перший рівень трійки розгалужується на першому символі в ключі. Другий рівень на другому символі тощо. Будь-який рядок можна шукати за допомогою пошуку першого символу з клавіші в словнику, щоб отримати другий словник, який використовується для пошуку другого символу з ключа тощо. Набір випадкових ключових рядків було б однорідним розподілом. Набір ключових рядків, які мають всі префікси (наприклад, усі слова, що починаються з "анти"), неодноріднірозповсюдження. В останньому випадку перший словник містить лише одне прив'язування, для "a", другий лише один для "n" тощо. Пошук будь-якого відображення в трійці завжди проводиться шляхом пошуку тих самих чотирьох словників з однаковими чотирма клавішами. Це неефективно, і ось що роблять октриси, якщо, наприклад, їх використовують для зберігання неоднорідних розподілів частинок, де переважна більшість частинок лежить у крихітному обсязі всередині векторного простору.


"Октриси намагаються"? Крім того, що ви маєте на увазі під "краще обробляти неоднорідність"? Однорідне - це не слово, з яким я стикався стосовно дерев.
Нолдорін

2
"Octtrees не потребує балансування"? Це абсолютно не вірно для октрепів, які зберігають неоднорідні точкові розподіли. По черзі, залежно від того, як ви загалом визначаєте "octtree": Повторне врівноваження octtree просто неможливо , незалежно від того, наскільки це бажано.
Jeffε

@Noldorin "Октриси намагаються". Так. Ви знаєте, що таке трійка? en.wikipedia.org/wiki/Trie
Джон Харроп

@Noldorin "Однорідне - це не слово, з яким я стикався стосовно дерев". Я маю на увазі однорідність розподілу, який розподіляється. Наприклад, при розподілі частинок у 3D-просторі атоми у твердому тілі розподіляються однорідно, тоді як зірки у Всесвіті розподіляються неоднорідно. kD дерева є більш переважними для неоднорідних розподілів, оскільки їх підрозділ простору є адаптивним.
Джон Харроп

@ Jɛ ff E «Збалансування октрису просто неможливо». Саме це я і мав на увазі. Вибачте, якщо моє формулювання було заплутаним.
Джон Харроп

2

Octrees корисні як базовий тип даних для моделей континууму, див., Наприклад, розв'язувач потоку Герріса . Життя досить складна в динаміці рідини, тому знаючи, що розміри всіх ваших субкубів залежать лише від їх глибини, повинен бути спрощуючим фактором.

Caveat: Я не флюїдний динаміст!


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