Если бы моей целью была скорость, а количество точек не было бы огромным (миллионы), я бы сосредоточился не только на алгоритмической памяти, но и на алгоритме.
Несбалансированное дерево k-d лучше всего подходит на бумаге, но для него требуются указатели, которые могут увеличить объем памяти в 3 раза, поэтому его нет.
Сбалансированное дерево k-d не требует хранения, кроме как для массива с одним скаляром для каждой точки. Но у этого тоже есть недостаток: скаляры не могут быть квантованы - они должны быть такими же 32-битными числами с плавающей точкой, что и в исходных точках. Если они квантованы, больше невозможно гарантировать, что точка, которая появляется раньше в массиве, находится либо на плоскости расщепления, либо слева от нее, И что точка, которая появляется позже в массиве, находится либо на плоскости расщепления, либо направо.
Существует структура данных, которую я разработал для решения этой проблемы. Люди Synergetics говорят нам, что объем является эмпирически четырехнаправленным. Давайте скажем, что самолет также эмпирически направлен на три направления.
Мы привыкли пересекать плоскость по четырем направлениям -x, + x, -y и + y, но проще использовать три направления a, b и c, которые указывают на вершины равносторонний треугольник.
При построении сбалансированного дерева k-d спроецируйте каждую точку на оси a, b и c. Сортируйте точки, увеличивая. Для получения средней точки округлите вниз, квантовайте и сохраните a. Затем, для подмассивов слева и справа от медианы, сортируйте по возрастанию b, а для медианных точек округляйте вниз, квантовайте и сохраняйте b. Повторяйте и повторяйте, пока в каждой точке не сохранится значение.
Затем, при проверке окружности (или чего-либо еще) против конструкции, сначала вычислите максимум a, b и c координаты окружности. Это описывает треугольник. В структуре данных, которую мы сделали в последнем абзаце, сравните срединную точку координату с максимумом окружности координатой. Если точка a больше круга a, мы можем дисквалифицировать все точки после медианы. Затем для подмассивов слева и справа (если не дисквалифицирован) от медианы сравните окружность b с координатой медианной точки. Повторяйте и повторяйте, пока больше не останется очков для посещения.
По теме это похоже на структуру данных BIH , но не требует интервалов -x и + x и -y и + y, потому что a, b и c так же хороши при обходе самолет, и для этого требуется меньшее количество направлений.