阿里面试题——如何实现微信“附近的人”功能?

面试题Category: Java阿里面试题——如何实现微信“附近的人”功能?
knights Staff asked 3 years ago

如果让你实现微信的“附近的人”功能,你会怎么做?

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 阿里面试题——如何实现微信“附近的人”功能?

FavoriteLoading添加本文到我的收藏
陈太旷 Staff replied 2 months ago

1.每次点击“”附近的人“功能,则由LBS重新获取终端经纬度位置存入表(保证附近的人位置实时、或误差不大,需要不断更新用户位置);
2.根据位置获取位置(x,y)一定范围内的用户,比如一公里,一公里换算成经纬度后,就是附近人的范围。
3.由近至远捞取该范围内的用户列表显示。

21 Answers
Best Answer
jadechenfei Staff answered 3 years ago

初期实现:客户端固定时间发送经纬度(x,y)到服务器s,服务器存储每个登陆的用户的经纬度到表t中,表t按照经纬度分表,将地图分成一个个的小格子。当用户店家“附近的人”时,对用户(x,y)进行计算,最多一次查询其中的4个格子(子表),计算两点间距离获取结果(有点像桶排序)。
性能上可以将表t替换为内存结构,容灾即可。
从实际的微信提供的功能来看,附近的人并不太多,估计是其对地图划分的格子很小。

FavoriteLoading添加本文到我的收藏
JoeyYao Staff replied 2 years ago

如果这个人移动了 变化了位置 如何快速的清空他的历史坐标呢?需要记录这个人的历史坐标的映射?

forest0517 Staff answered 2 years ago

以用户当前经纬度画圆,半径视需求,然后找出经纬度落在这个圆里面的点。

FavoriteLoading添加本文到我的收藏
he11o Staff answered 2 years ago

赞同ls的思路。我补充一下:每个手机终端都有自己的坐标(a,b),以(a,b)为圆心,定义“附近”的距离为半径r做圆,改圆的一半方程为:(x-a)²+(y-b)²=r²。只要其他用户的坐标代入圆的一般方程满足  (x-a)²+(y-b)² <=r² 即为“附近”的用户。
 

FavoriteLoading添加本文到我的收藏
he11o Staff answered 2 years ago

还有一个思路:直接用两点间的距离公式(自行百度),只要计算出来的距离小于所定义的“附近”就可以了。
 

FavoriteLoading添加本文到我的收藏
zhuoxiong Staff answered 2 years ago

我的觉上面说的都对,但是不全。例如看了你们的回答我就有一个疑问:我怎么查询附近用户,难道用每次都要扫描一次所有用户?我觉得应该是将某个特殊区域作为一个键,值应该是这个区域内的人,但是存在边界问题。当用户在边界的时候可能出现附近的人显示特别少,而实际上人却很多,在这样的情况下,也许可以重合一定区域,但是又会造成值重复存取,费空间,并且比较难维护数据。

FavoriteLoading添加本文到我的收藏
1 2 3 5 Next »

return top