які переваги октрисів у просторовому / часовому виконанні чи в іншому випадку, і в яких ситуаціях вони найбільш застосовні (я чув програмування 3D графіки)?
kD-дерева є збалансованими двійковими деревами, а octrees є спробами, тому переваги та недоліки, ймовірно, успадковуються із тих більш загальних структур даних. Конкретно:
- Перебалансування може бути дорогим (октрейсам не потрібно перебалансування).
- Врівноваження справляється з неоднорідністю краще, оскільки воно адаптивне.
- Більш високий коефіцієнт гіллястості в октрисах означає дрібніші дерева (менша кількість непрямих та виділень) для однорідних розподілів.
Крім того, бісекція (як в октрисах) піддається тривіальній реалізації з точки зору біт-подвійності. Так само, я думаю, що октриси можуть отримати велику користь від попередньо обчислених відстаней під час пошуку діапазону.
EDIT
Мабуть, мої посилання на спроби та однорідність потребують уточнення.
Спроби - це сімейство структур даних, представлених деревами словників, і вони використовуються як словники для ключів, що є послідовностями (найбільш помітними рядками, але також послідовностями ДНК та бітами в хеш-значенні для хеш-спроб). Якщо кожен словник відображає по одному біту кожної з координат x, y і z (найзначніший біт на першому рівні трійки, наступний значущий біт на другому рівні тощо), то трие - це октрис, який рівномірно розподіляє тривимірний простір. Отже, октриси успадковують характеристики спроб, які, як правило:
- Високий коефіцієнт гіллястості може означати неглибокі дерева, які мають декілька непрямих напрямків, тому пошук швидкий, наприклад, 20 рівнів бінарного дерева можуть бути збережені в 4 рівнях дерева з коефіцієнтом розгалуження 256.
- Проби не врівноважуються під час вставки та видалення, економлячи дорогу операцію, необхідну для врівноважених бінарних дерев.
Недоліком є те, що неоднорідність може призвести до незбалансованих спроб / октрей, тому пошук може вимагати багатьох непрямих. Еквівалентна задача в спробах вирішується за допомогою стиснення краю для згортання декількох рівнів непрямості на єдиний рівень. Octrees цього не роблять, але ніщо не заважає вам стискати octree (але я не думаю, що ви могли б назвати результат octree!).
Для порівняння розглянемо спеціалізований словник для рядкових ключів, який представлений у вигляді трие. Перший рівень трійки розгалужується на першому символі в ключі. Другий рівень на другому символі тощо. Будь-який рядок можна шукати за допомогою пошуку першого символу з клавіші в словнику, щоб отримати другий словник, який використовується для пошуку другого символу з ключа тощо. Набір випадкових ключових рядків було б однорідним розподілом. Набір ключових рядків, які мають всі префікси (наприклад, усі слова, що починаються з "анти"), неодноріднірозповсюдження. В останньому випадку перший словник містить лише одне прив'язування, для "a", другий лише один для "n" тощо. Пошук будь-якого відображення в трійці завжди проводиться шляхом пошуку тих самих чотирьох словників з однаковими чотирма клавішами. Це неефективно, і ось що роблять октриси, якщо, наприклад, їх використовують для зберігання неоднорідних розподілів частинок, де переважна більшість частинок лежить у крихітному обсязі всередині векторного простору.