我正在开展一个学校项目,该项目涉及获取一个纬度/长点并找到已知地点列表中的前五个最近点。该列表将存储在内存中,需要注意的是我们必须选择“适当的数据结构” - 也就是说,我们不能简单地将所有位置存储在数组中并以线性方式逐个比较距离。老师建议将美国州的地点数据分组,以防止计算显然距离太远的地方的距离。我想我可以做得更好。
从我在网上的研究看来,R-Tree或其变体之一似乎是一个简洁的解决方案。不幸的是,这个句子是我理解实际技术时所得到的,因为文学对于我的非学术头脑而言过于密集。
有人能给我一个非常高的概述,说明使用纬度/经度数据填充R树的过程是什么,然后遍历树以找到给定点的那5个最近邻居?
此外该项目是在C中,我不必重新发明轮子,所以如果您使用了R Tree的现有开源C实现,我会对您的体验感兴趣
UPDATE: This blog post描述了区域分区空间(如PR四叉树)的直接搜索算法。希望能帮助未来的读者。
答案 0 :(得分:7)
您是否考虑过其他数据结构? 我相信,Point Quadtree不是R-tree,而是更有效地满足您的需求。Spatial Index Demos为可能的数据结构列表提供了一些演示,包括R-tree和Point Quadtree。希望它能提供见解。
答案 1 :(得分:5)
Quad Trees
四叉树占用一个正方形的空间,并将其划分为四个子节点,沿X和Y轴的尺寸为一半。
+---+---+
| | | Each square is a child
| | | of the parent; when you
+---+---+ get to leaves a node has
| | | a single point or a list
| | | of points.
+---+---+
此数据结构是递归的,您可以通过检查哪个孩子持有该点来搜索点,直到您到达叶子。叶子要么具有单个成员(带有X,Y坐标的点),要么具有成员列表,具体取决于实施方式。如果填满节点,则将其拆分为4并分发子节点。本质上,数据结构是二叉树的概括,因此它不一定是平衡的。
平衡四叉树可能不是您的目的所必需的,并留给读者练习 - 尝试在网上搜索“平衡四叉树”
请注意,此数据结构无法索引可能重叠的项目,但如果您只存储点数,则不会出现问题。
在四叉树中查找最近邻居
离开我的头顶,这是一个快速而肮脏的算法,用于找到你的观点的'n'最近邻居。它不一定非常有效,但实施起来相当简单。如果某人有更好的链接,请随时在评论或回答中发布。
找到包含的四叉树节点 你的观点,保留一份清单 父母。
推送所有点 节点进入基于的优先级队列 他们与基点的距离 (即斜边的长度 根据毕达哥拉斯定理)。根据 关于实施可能有 每个节点一个或多个。简单来说 优先级队列的实现 数据结构,查找'二进制 堆”。
如果任何'n'点距离边界框的边缘更远,则添加其邻居的内容。即如果您的基点靠近边界框的边缘,则相邻树节点可能包含比边界框中找到的点更近的点。您需要备份树才能执行此操作,这就是您需要跟踪父节点的原因。
当所有'n'个最近点都比边界框的边缘更近时,您知道可能不存在您错过的邻居。因此,此框中的“n”个最近点必须是您的“n”个最近邻居。