Предложение. Хорошей простой и эффективной структурой данных для пространственных запросов является многомерное двоичное дерево.
В традиционном бинарном дереве есть один «дискриминант»; значение, которое используется для определения того, выбираете ли вы левую или правую ветку Это можно считать одномерным случаем.
В многомерном бинарном дереве у вас есть несколько дискриминантов; последовательные уровни используют разные дискриминанты. Например, для двумерных пространственных данных вы можете использовать координаты X и Y в качестве дискриминантов. Последовательные уровни будут использовать X, Y, X, Y ...
Для пространственных запросов (например, для нахождения всех узлов в прямоугольнике) вы выполняете поиск в глубину дерева, начинающегося с корня, и используете дискриминант на каждом уровне, чтобы избежать поиска вниз по ветвям, которые не содержат узлов в данный прямоугольник.
Это позволяет вам потенциально сократить пространство поиска пополам на каждом уровне, что делает его очень эффективным для поиска небольших областей в массивном наборе данных. (Кстати, эта структура данных также полезна для запросов с частичным совпадением, то есть запросов, в которых пропущен один или несколько дискриминантов. Вы просто просматриваете обе ветви на уровнях с пропущенным дискриминантом.)
Хорошая статья об этой структуре данных: http://portal.acm.org/citation.cfm?id=361007
В этой статье есть хорошие схемы и описания алгоритмов: http://en.wikipedia.org/wiki/Kd-tree