题目重点:给定坐标和半径查找全部商铺,使用空间候选索引与精确距离过滤,处理跨界和更新。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练输入经纬度与非负米制半径,输出活跃且有权限显示商铺,按(distance,id)稳定排序。球面距离近似适用范围与极区/大半径需先确认。
- 半径查询不同于地图当前屏幕矩形;分页不能省略候选cell边界外仍在圆内的点。
解题路线
- 商铺记录id/location/version/status,空间索引用网格/geohash/树按经纬度定位。根据radius选择覆盖cell集合,而非只查中心一个cell;索引返回候选后做精确球面距离≤radius。
- 矩形包围盒是候选过滤,圆外四角要排除。经度跨±180°拆成两段范围,近极区经度跨度不能用固定度数等距转换;必要时选择球面索引。
- 候选按权威商铺状态去重和过滤,计算距离再排序。商铺迁移用version更新新旧cell,读时验证当前location,旧索引项不能让重复/已经远离的点出现。
- 大半径密集区结果多,API设合理radius/pageSize上限并返回cursor。若要求全部结果,必须分页直到耗尽,不能偷偷只给TopK;排序cursor需snapshot/queryVersion避免动态更新翻页重复遗漏。
- 缓存key包括位置量化、radius/filter/indexVersion,但粗粒度位置共用缓存仍需对请求真实坐标精确过滤。极热门区域独立分片与请求合并,观察候选/实际命中比优化cell大小。
手动走一遍
商铺在圆边缘且位于邻cell,只查中心geohash会漏掉;包围盒角落距离超过半径,即使候选索引命中仍应排除。经度179.9°附近半径跨日期线时,-179.9°商铺可能很近,不能直接经度差359.8°。
规模与取舍
空间树理想查询O(log N+C),C候选数;精确过滤O(C),排序O(M log M)。密集或巨大半径最坏C=N,索引不能保证输出N条仍O(log N)。存储O(N),移动需更新空间索引和权威记录。
易错点与追问
容易失分的边界
- 经纬度差的欧氏距离不等于米制球面距离,尤其跨日期线和高纬。
- 网格覆盖只取中心格漏邻近结果。
继续深挖
- 按距离TopK与半径内全部结果的停止条件怎样不同?
- 距离恰好边界受浮点误差时,容差应怎样固定并对分页保持一致?
