Gợi ý: Cấu trúc dữ liệu hiệu quả đơn giản tốt cho các truy vấn không gian là một cây nhị phân nhiều chiều.
Trong cây nhị phân truyền thống, có một "phân biệt đối xử"; giá trị được sử dụng để xác định xem bạn có rẽ nhánh trái hay nhánh phải không. Điều này có thể được coi là trường hợp một chiều.
Trong cây nhị phân nhiều chiều, bạn có nhiều phân biệt đối xử; các cấp độ liên tiếp sử dụng các phân biệt đối xử khác nhau. Ví dụ, đối với dữ liệu không gian hai chiều, bạn có thể sử dụng tọa độ X và Y làm phân biệt đối xử. Các cấp liên tiếp sẽ sử dụng X, Y, X, Y ...
Đối với các truy vấn không gian (ví dụ tìm tất cả các nút trong một hình chữ nhật) bạn thực hiện tìm kiếm theo chiều sâu của cây bắt đầu từ gốc và bạn sử dụng phân biệt đối xử ở mỗi cấp để tránh tìm kiếm các nhánh không chứa các nút trong hình chữ nhật đã cho.
Điều này cho phép bạn có khả năng cắt giảm không gian tìm kiếm ở một nửa ở mỗi cấp, làm cho nó rất hiệu quả để tìm các vùng nhỏ trong một tập dữ liệu khổng lồ. (BTW, cấu trúc dữ liệu này cũng hữu ích cho các truy vấn đối sánh từng phần, tức là các truy vấn bỏ qua một hoặc nhiều phân biệt đối xử. Bạn chỉ cần tìm kiếm cả hai nhánh ở cấp độ với một phân biệt bỏ qua.)
Một bài báo tốt về cấu trúc dữ liệu này: http://portal.acm.org/citation.cfm?id=361007 bài viết này có sơ đồ tốt và mô tả thuật toán: http://en.wikipedia.org/wiki/Kd-tree
Cảm ơn bạn, để được trông một cách chính xác những gì tôi đã gặp khó khăn để tìm (và Haskell là tốt :) – wrt