我有一组很多轴对齐的矩形,可能是嵌套和交叉的。我希望能够找到包含/绑定查询点的所有矩形。对此有什么好处?
编辑:附加信息 -
很多我的意思是1亿或更多
矩形分布在一个巨大的跨度(一个国家的跨度)。尺寸没有限制
是的,矩形可以预先处理并存储在树形结构中
4.不需要实时插入和删除
5.我只需要找到包围/绑定给定查询点的所有矩形。我不需要最近的邻居。
正如您可能已经猜到的那样,这适用于移动设备上的实时地理围栏应用程序,因此 - 6.对于距离该点足够远的矩形,不需要重复搜索。
我通过将每个矩形近似到一个点来尝试KD树和四叉树。他们根据矩形的大小给了我不同的性能。 有更直接的方式吗? r树怎么样?
答案 0 :(得分:1)
我会考虑使用四叉树。 (从移动设备发布,因此链接过于费力,但维基百科有一个不错的解释。)您可以在任何矩形的左,右,顶部和底部分割,并将每个矩形存储在代表的节点中包含矩形的最小区域。要搜索一个点,您可以沿着四叉树朝向该点,并检查沿着该路径遇到的每个矩形。
这适用于小矩形,但如果许多矩形覆盖几乎整个区域,您仍然需要检查所有这些。
答案 1 :(得分:0)
您需要查看R * -tree数据结构。
与许多其他结构相比, R * -tree能够存储(重叠)矩形。 不仅限于点数据。在将多边形放入索引之前,您将能够找到许多关于如何最佳近似多边形的出版物。此外,它可以扩展到相当大的数据,因为它也可以在磁盘上运行。
批量加载时R * -trees更快;因为这可以用于减少索引页面的重叠并确保几乎完美平衡的树,而动态插入仅保证每个页面至少半满左右。即批量加载的树通常只使用一半的内存/存储空间。
对于2d数据和您的查询类型,四叉树或网格可能效果不错。这取决于本地数据密度的变化程度。