美文网首页
“附近的人”的技术原理

“附近的人”的技术原理

作者: 胖三斤66 | 来源:发表于2020-02-24 16:30 被阅读0次

摘自 怎么快速找到:附近的人 - 知乎
仅供个人使用

问题描述:如何实现 “附近的人” 功能?

暴力法:欧式距离

原理:计算这个用户与其他用户的欧氏距离,然后进行排序

优点:实现简单

缺点:时间复杂度高,当用户量大时,即使使用类似于 MR 的分布式运算,也需要消耗大量资源。
总时间复杂度=计算时间+排序时间=O(n) + O(n*logn)

推荐:GeoHash

原理:将地图展开成一个平面,将平面切割成小格并为小格编号。将用户的位置转换成所处小格的编号。与当前用户同一个格子或附近格子的用户返回给当前用户。

GeoHash:为格子编号的一种编码方式: 『每次将范围折半,值处于前半部分,得 0;反之,得 1。』

// geohash的伪代码
public String getCode(double value, double min, double max, double codeLen){
  StringBuilder sb = new StringBuilder();
  
  // codeLen:对折次数,即code的长度
  for(int i=0; i<codeLen; i++){
    double mid = (max + min) / 2.0;
    if(value < min){  // 说明 值处于前半区
      sb.append('0');
    } else{   // 说明 值处于后半区
      sb.append('1');
    }
  }
  return sb.toString();
}
GeoHash计算方式的示例 GeoHash完整的转换

问题:如何快速查找 “附近的人”?

1)将 (user_id, user_geoCode) 存入数据库并在 user_geoCode 建索引
2)select * from locTable where user_geoCode = curUser_geoCode 返回附近的人(即同一格子的人)

更多问题(如下)见参考文献

  • 编码设置为多少位比较合适?
  • 同一格子内没有人,该如何处理?

相关文章

  • “附近的人”的技术原理

    摘自 怎么快速找到:附近的人 - 知乎仅供个人使用 问题描述:如何实现 “附近的人” 功能? 暴力法:欧式距离 原...

  • 附近的人功能实现及原理

    如何查找当前点(118.818747°E,32.074497°N)附近500米的人? 这一类功能很常见(如微信附近...

  • 技术创业 - 附近的人LBS解析

    一直在创业的最前线,对于一个技术创业者来说,技术、产品、运营都是你应该关注的事情。市面有很多基于LBS的移动App...

  • 附近的人,附近的骗子

    有人和我打招呼,一看是附近的人,还是个美女啊,怎么办,心里慌慌的,虽然只是一句“你好”,但是真的不好啊,因为不熟,...

  • 附近的人

    李小林 好恐怖 果然,男人真心靠不住 死人李小林 一句话,就暴露老司机的本事ฺ(д)ฺ “我有了孩子了,是你的” ...

  • 附近的人

    聽說微信裡的漂流瓶關閉了 嚇得我趕緊打開了附近人 一群老少爺們裝歐巴 蜂擁而至 每個頭像後面有著不同的面孔 卻是一...

  • 附近的人

    附近的人 由于种种原因,上高一的我随父母搬去了新的城市。陌生的环境,陌生的城市,陌生的街道,陌生的学校,陌生的老师...

  • 附近的人

    夜里九点,客厅没有开灯,四下黑幽幽一片,墙上的电视机忽明忽暗地闪烁着。 手机再次响起。“我说你这人听不懂人话是吧?...

  • 附近的人

    我打开 附近的人 眺望 可能在期望遥远的边疆 关闭 附近的人 摇了摇头 有时候 真的只是那样 也就那样

  • 附近的人

    A加上一个“附近的人”,开始一场爱的游戏 我与安捷(化名)是在QQ上认识的。那是一个周末晚上,做完作业没事便想聊聊...

网友评论

      本文标题:“附近的人”的技术原理

      本文链接:https://www.haomeiwen.com/subject/mrwvqhtx.html