Как выполнить запрос диапазона большой размерности с фиксированным диапазоном?

У меня около 10 ^ 4 точек в 7-мерном пространстве. Для определенного приложения мне нужно сделать ~ 10 ^ 6 запросов диапазона на этом входе, чтобы найти все точки, которые лежат внутри заданного диапазона. В этом приложении все запросы используют один и тот же размер диапазона. Какова подходящая структура данных для этой задачи?

kd-tree кажется подходящим, но для 7 измерений и небольшого размера вывода оно почти линейно по временной сложности запросов. Другим решением являются деревья диапазонов, но они кажутся слишком сложными для создания небольшого количества входных данных в этом приложении. Кроме того, я не вижу ни одной из этих структур, использующих тот факт, что диапазон имеет постоянный размер в своих интересах. Например, если бы это была одномерная задача, все запросы запрашивали бы точки, лежащие в диапазоне размера 10, например, в разных местах на числовой прямой.


person Ashwin Nanjappa    schedule 24.04.2014    source источник
comment
Являются ли запросы автономными или вам нужно выполнять их по запросу? В онлайн-кейсе я не думаю, что тот факт, что они имеют одинаковый размер, вам что-то даст. В автономном случае я не уверен, вы можете, по крайней мере, убрать одно измерение, используя скользящее окно. Это все еще, вероятно, не стоит   -  person Niklas B.    schedule 24.04.2014
comment
@НикласБ. Запросы онлайн, сгенерированные на основе результатов более ранних запросов диапазона.   -  person Ashwin Nanjappa    schedule 24.04.2014
comment
Да, и еще одна идея: если ваши точки не слишком плотные, вам может сойти с рук разделение их на сегменты по размеру вашего запроса. Затем запрос будет пересекаться не более чем с 2 ^ d из этих сегментов (что в вашем случае равно 128). Если точек достаточно мало, это может сэкономить серьезную работу. Конечно, тогда также возникает проблема поиска правильных сегментов для запроса, но опять же, в зависимости от ваших данных может быть не слишком много непустых сегментов, и вы можете использовать линейный поиск. И, конечно, вы можете изучить хэширование на основе местоположения, но я не думаю, что это очень хорошо, если вы хотите оптимальности.   -  person Niklas B.    schedule 24.04.2014
comment
@НикласБ. Спасибо! Это хорошая идея. Самет предлагает использовать такую ​​равномерную сетку с размером ячеек, равным размеру диапазона в своей книге «Пространственные структуры данных». Позвольте мне также проверить хеширование на основе местоположения.   -  person Ashwin Nanjappa    schedule 24.04.2014
comment
Деревья покрытия также заслуживают изучения, если ваши данные имеют меньший размер, чем пространство, в которое они встроены.   -  person David Eisenstat    schedule 28.04.2014


Ответы (1)


Ну, это поздний ответ, я не знаю, полезен ли он сейчас. Вы можете использовать FQT фиксированной высоты (FHFQT или FHQT) [http://users.dcc.uchile.cl/~rbaeza/ftp/fqtrees.ps.gz] или массивы фиксированных запросов (FQA) [http://www.dcc.uchile.cl/~gnavarro/ps/mtap01.pdf]. Эти структуры хорошо работают в такого рода поиске сходства. Кроме того, вам нужно использовать хороший метод выбора опорной точки, такой как инкрементный, чтобы получить хорошие результаты. Я предполагаю, что вы используете евклидово расстояние, а гистограмма расстояний представляет собой распределение Гаусса. Извините за мой английский...

person Andres    schedule 31.08.2016