Sugerencia: Una buena estructura de datos eficiente simple para consultas espaciales es un árbol binario multidimensional.
En un árbol binario tradicional, hay un "discriminante"; el valor que se usa para determinar si toma la rama izquierda o la rama derecha. Esto se puede considerar como el caso unidimensional.
En un árbol binario multidimensional, tiene múltiples discriminantes; niveles consecutivos usan diferentes discriminantes. Por ejemplo, para datos espaciales bidimensionales, puede usar las coordenadas X e Y como discriminantes. Los niveles consecutivos usarían X, Y, X, Y ...
Para las consultas espaciales (por ejemplo, encontrar todos los nodos dentro de un rectángulo) se hace una búsqueda en profundidad del árbol que comienza en la raíz, y se usa discriminante en cada nivel para evitar buscar ramas que no contengan nodos en el rectángulo dado.
Esto le permite reducir el espacio de búsqueda a la mitad en cada nivel, lo que lo hace muy eficiente para encontrar regiones pequeñas en un conjunto de datos masivo. (Por cierto, esta estructura de datos también es útil para consultas parciales, es decir, consultas que omiten uno o más discriminantes. Solo busca en ambas ramas en niveles con un discriminante omitido)
Un buen documento sobre esta estructura de datos: http://portal.acm.org/citation.cfm?id=361007 Este artículo tiene buenos diagramas y descripciones algoritmo: http://en.wikipedia.org/wiki/Kd-tree
Gracias, que parece ser precisamente lo que yo estaba luchando para encontrar (y Haskell está bien :) – wrt