如何实现查找附近的人

问题:给定一个用户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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值