Джитамаро предложил, но не объяснил метод, основанный на квадри-дереве «2x размер».Это разумное предположение, за исключением того, что в квадри-дереве используется в четыре раза больше узлов, чем двух, как я объясню ниже, прежде чем предварительно предложить альтернативный метод.
Предположим, что каждая координата (x, y) имеет -.5 < x <= .5
и -.5 < y <= .5
, и когда j, k
являются целыми числами, точка (x + j, y + k) совпадает с точкой (x, y).Пусть квадродерево T покрывает точки с координатами в диапазоне -1 < x,y <= 1
.Каждый раз, когда вы добавляете элемент в (x, y) к T, где -.5 < x,y <= .5
, пусть x' = {x-1
, если x>0
else x+1}
, и y' = {y-1
, если y>0
else y+1}
.Также добавьте элемент в (x, y '), (x', y ') и (x', y).[Когда вы удалите точки позже, снова вычислите (x ', y') и др. И удалите их тоже.] Легко видеть, что поиск ближайших точек будет работать правильно, пока любая координата поиска вне интервала (-.5,.5]
настроена
Если четырёхкратное количество узлов является ограничителем сделок, обратите внимание, что если координаты, как описано выше, используются в поддеревьях выше, скажем, уровне k=3
, а относительные координаты сохраняются ниже уровня k
, должно быть возможно поддерживать отдельные копии поддеревьев ниже уровня k
.То есть каждое поддерево на уровне k
будет иметь четырех родителей.(Я не думал об этом достаточно, чтобы знать, работает ли это полностью; отредактирую ответ, если я нахожу, что это не так.)