我正在制作地图应用程序。我有一堆位置的坐标。我想返回屏幕上可见区域内的所有点。这是通过谷歌地图 api 完成的。它为您提供屏幕上可见的地图的东北和西南坐标。我正在使用 MongoDb。
显而易见的方法是以ne-sw对角线的中点为中心,到任一角的距离为半径,并找到该半径内的所有点。
但是将它们存储在单个列表中将是一个 O(n) 操作 - 无法针对每个请求进行扩展。存储它们以便能够快速获得积分的更好方法是什么?
我正在考虑将它们分成包含半径(r)内所有点的桶,并改为维护一个排序的桶列表。由于屏幕最多可以在 4 个桶上(每个角落在一个单独的桶上),我在 O(log n) 中找到最近的桶,在 O(1) 中找到接下来的 3 个最近的桶。现在我只需要对这 4 个存储桶进行计算。
但这仍然是很多桶!谷歌能够非常快速地在地图上渲染点。他们有很多点。还有很多用户。他们是如何管理的?我不希望达到那种优化水平,但必须有更好的数据结构。