Я работаю над частью программного обеспечения 3D, которое иногда должно выполнять пересечения между массивными числами кривых (иногда ~ 100 000). Самый естественный способ сделать это - выполнить проверку ограничивающего прямоугольника N^2, а затем пересекаются кривые, перекрывающие ограничивающие поля.Как получить результаты эффективно из Octree/Quadtree?
Я слышал хорошие вещи о октетах, поэтому я решил попробовать его реализовать, если я получу улучшенную производительность.
Вот мой проект: Каждый октябрьский узел реализован как класс со списком поднодов и упорядоченным списком индексов объектов.
Когда объект добавляется, он добавляется к самому нижнему узлу, который полностью содержит объект, или некоторые из этих дочерних узлов, если объект не заполняет всех дочерних элементов.
Теперь я хочу получить все объекты, которые совместно используют узел дерева с данным объектом. Для этого я пересекаю все узлы дерева, и если они содержат данный индекс, я добавляю все их другие индексы в упорядоченный список.
Это эффективно, потому что индексы внутри каждого узла уже упорядочены, поэтому выяснение того, находится ли каждый индекс в списке, выполняется быстро. Однако список должен быть изменен, и это занимает большую часть времени в алгоритме. Поэтому мне нужна какая-то древовидная структура данных, которая позволит мне эффективно добавлять упорядоченные данные, а также быть эффективными в памяти.
Любые предложения?
Я уверен, что вы ошибаетесь в отношении * изменения размера *, вызывающего проблемы. Изменение размера имеет ту же сложность, что и добавление O (N) для заполнения списка размера N. С другой стороны, перемещение элементов вокруг для ведения списка, отсортированного, имеет сложность O (N * N), если элементы не добавлены в порядке. – Rotsor