如何实现查找附近的人

来源:互联网 发布:小说软件下载排行榜 编辑:程序博客网 时间:2024/04/30 13:58

问题:给定一个用户A,返回与此用户相距小于d的所有用户。支持GEO的后端存储有MongoDB,Redis等。那么如果让我们实现,我们应该怎么做呢?


思路:围绕此用户生成一个圆形,半径是d,返回所有被此园覆盖的用户。


方法1: 先求方,再求园。

如果直接求园,每一个用户都要计算距离值,无法利用到索引,可以先求方,将经度值和纬度值分别差值小于半径的点拿出来,然后在求园,将不符合点的用户过滤。


方法2: 位置敏感hash

MongoDB采用的就是这种方式:具体方式是先将整个地图分为四个相等的区域,然后给每个区域赋值,比如左下方是00,左上方是01,右下方是10,右上方是11. 

a. 给定一个点,算出此点在哪个区域,比如在右上方,则是11,那么geohash的值的前两位就是11.

b. 将右上方区域继续切分为四个相等的区域,然后算出此点在哪个区域,如果在右下方,那么geohash的接下来两位就是10.

c 就这样迭代n次,geohash的值就是2n位的。n越大,精度越高,MongoDB的默认值是26次。


然后计算相邻的时候就比较容易了,因为hash值是位置敏感hash,所以越是相近的点那么他们的差值就越小。


方法2的优点显而易见,求相邻的速度非常快,是O(1), 缺点是模拟相邻,并不是真正的圆形等距离,不过这一缺点可以靠增加迭代次数实现,也就是精度提高。方法1的优点是严格的圆形等距离,但缺点是算法复杂度根附近的用户数相关。

原文:http://blog.csdn.net/hongchangfirst/article/details/51518371

作者:hongchangfirst

hongchangfirst的主页:http://blog.csdn.net/hongchangfirst



0 0
原创粉丝点击