Зачем кому-то использовать Octree поверх KD-дерева?


32

У меня есть некоторый опыт в научных вычислениях, и я широко использовал kd-деревья для приложений BSP (разбиение двоичного пространства). Недавно я стал более знаком с октреями, схожей структурой данных для разделения трехмерных евклидовых пространств, но той, которая работает с фиксированными регулярными интервалами.

Небольшое исследование независимости, кажется, показывает, что kd-деревья обычно превосходят по производительности для большинства наборов данных - быстрее создавать и запрашивать. Мой вопрос: каковы преимущества октод в пространственно-временном исполнении или нет, и в каких ситуациях они наиболее применимы (я слышал, программирование трехмерной графики)? Краткое изложение преимуществ и проблем обоих типов мне бы очень понравилось.

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


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

Следует отметить, что kd-деревья имеют гарантированную небольшую глубину. Сжатые четырехугольные деревья могут доставить вас туда, но они менее удобны.
Суреш Венкат

@Suresh Venkat: Спасибо за это. Я не знаком со сжатыми квадриами, но действительно ли они подойдут для трехмерных пространственных повторений? Возможно, есть аналог «сжатого октри».
Нолдорин

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

Ответы:


23

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

Более подробно: если вы запрашиваете -approximate ближайшего соседа к точке запроса , а фактический ближайший сосед находится на расстоянии , вы обычно заканчиваете поиском, который проверяет каждую ячейку структуры данных, которая достигает изнутри в внешняя поверхность кольца или кольцевая оболочка с внутренним радиусом и внешним радиусом . Если ячейки имеют ограниченное соотношение сторон, как и в дереве квадрантов, то таких ячеек может быть не более , и вы можете доказать хорошие границы времени для запроса. Если соотношение сторон не ограничено, как в дереве, эти границы не применяются.q d d ( 1 + ϵ ) d 1 / ϵ d - 1 k Dϵqdd(1+ϵ)d1/ϵd1kD

kD деревья обладают другим преимуществом по сравнению с квадродеревами в том смысле, что они гарантированно имеют максимальную логарифмическую глубину, что также увеличивает время запроса ближайшего соседа. Но глубина квадродерева - это самое большее число бит точности ввода, которое обычно невелико, и существуют теоретические методы управления глубиной, которые должны быть по существу логарифмическими (см. Структуру данных с пропуском дерева квадрантов).


4
См. Недавний учебник Сэриэля Хар-Пеледа для современного резюме сжатых деревьев.
Джефф

Спасибо за хорошее количественное резюме, Дэвид. Просто чтобы подтвердить: вы используете «соотношение сторон» как синоним «коэффициент ветвления»? Я определенно должен проверить пропущенные квадри / октре, а также, возможно, сжатые квадри / октри.
Нолдорин

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

Я пропустил "клетки в". Имеет смысл сейчас.
Нолдорин

15

Группа друзей и я работаем над космической RTS игрой как веселым сайд-проектом. Мы используем многое из того, чему научились в Computer Science, чтобы сделать его высокоэффективным, что позволит нам впоследствии создавать огромные армии.

Для этой цели мы рассмотрели использование kd-деревьев, но мы быстро отклонили их: вставки и удаления чрезвычайно распространены в нашей программе (рассмотрим корабль, летящий в космосе), и это нечестивый беспорядок с kd-деревьями. Поэтому мы выбрали октры для нашей игры.


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

2
Это зависит от того, как вы исправите kd-дерево. Хорошая временная сложность в лучшем случае - это не то, к чему я обычно стремлюсь: например, bogosort имеет O (1) сложность в лучшем случае, но я надеюсь, что никто не использует ее.
Алекс тен Бринк

К сожалению, я не могу найти какие-либо хорошие сводки временных сложностей для общих операций над этими структурами данных, но это не так. Средняя сложность времени часто проницательна ...
Нолдорин

1
Я действительно думаю, что вам все равно будет лучше, если вы просто используете дерево KD, которое вращает оси и просто делит пространство посередине. Пропустите громоздкий SAH и другие дорогие средние сокращения, и вы получите что-то, что не только ищет быстрее, чем октри, но и строит быстрее. Поскольку вы делите пространство равномерно, как если бы вы использовали октри, но с бинарным деревом, а не с 8-ю деревьями, все, что вы делали раньше для удалений, не должно быть более сложным с деревом KD, так как Вы будете равномерно распределены аналогичным образом. Пример: вы можете просто удалить пустые узлы за пределами глубины N.
Dragon Energy

8

Каковы преимущества октод в пространственно-временном исполнении или нет, и в каких ситуациях они наиболее применимы (я слышал, программирование трехмерной графики)?

кД деревья сбалансированные бинарные деревья и octrees являются попытки так преимущества и недостатки, вероятно , унаследованные от этих более общих структур данных. В частности:

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

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

РЕДАКТИРОВАТЬ

Очевидно, мои ссылки на попытки и однородность нуждаются в уточнении.

Попытки представляют собой семейство структур данных, представленных деревьями словарей, и используются в качестве словарей для ключей, которые являются последовательностями (в первую очередь, строками, но также последовательностями ДНК и битами в значении хэша для хэш-попыток). Если каждый словарь отображает один бит каждой из координат x, y и z (старший значащий бит на первом уровне дерева, следующий значащий бит на втором уровне и т. Д.), То дерево представляет собой дерево, которое равномерно разделяет трехмерное пространство. Следовательно, октреи наследуют характеристики попыток, которые, как правило:

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

Недостатком является то, что неоднородность может привести к несбалансированным попыткам / октодам, поэтому поиск может потребовать много косвенных указаний. Эквивалентная проблема в попытках решается с помощью сжатия краев для объединения нескольких уровней косвенности в один уровень. Октреи не делают этого, но ничто не мешает вам сжать октри (но я не думаю, что вы могли бы назвать результат октреем!).

Для сравнения рассмотрим специализированный словарь для строковых ключей, который представлен в виде дерева. Первый уровень дерева ветвится на первом символе в ключе. Второй уровень на втором персонаже и тд. Любую строку можно найти, выполнив поиск первого символа в ключе словаря, чтобы получить второй словарь, который используется для поиска второго символа в ключе и так далее. Набор строк случайных ключей будет однородным распределением. Набор ключевых строк, которые имеют общий префикс (например, все слова, начинающиеся с «анти»), являются неоднороднымираспределение. В последнем случае первый словарь содержит только одну привязку для «a», второй - только одну для «n» и так далее. Поиск любого отображения в дереве всегда осуществляется путем поиска в тех же четырех словарях с теми же четырьмя ключами. Это неэффективно, и это то, что делают октреи, если, например, они используются для хранения гетерогенных распределений частиц, где подавляющее большинство частиц находится в крошечном объеме в векторном пространстве.


"октреи есть попытки"? Кроме того, что вы подразумеваете под "лучше справляется с неоднородностью"? Гомогенное - это не то слово, с которым я столкнулся в отношении деревьев.
Нолдорин

2
"Octtrees не нужно перебалансировать"? Это абсолютно неверно для октодеревьев, которые хранят гетерогенные точечные распределения. С другой стороны, в зависимости от того, как обычно вы определяете «октавное дерево»: перенастройка октябрьского дерева просто невозможна , какой бы желательной она ни была.
Джефф

@Noldorin "октреи это попытки". Да. Вы знаете, что такое три? ru.wikipedia.org/wiki/Trie
Джон Харроп

@Noldorin "Гомогенное это не слово, с которым я столкнулся в отношении деревьев". Я имею в виду однородность распределенного раздела. Например, при разделении частиц в трехмерном пространстве атомы в твердом теле равномерно распределены, тогда как звезды во Вселенной распределены неоднородно. kD деревья более предпочтительны для гетерогенных распределений, потому что их подразделение пространства адаптивно.
Джон Харроп

@ Jɛ ff E "Перебалансировка октдерева просто невозможна". Это именно то, что я имел в виду. Извиняюсь, если моя формулировка сбивает с толку.
Джон Харроп

2

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

Предостережение: я не подвижный динамик!


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