寻找离你最近的加油站

481 阅读1分钟

一个面试题,当时头脑不清楚,回答的不好,特此总结一番。油站数量百万级,范围全国范围,不限数据结构或工具。

在面试回答解法:

  • 分块

全国的地区按方形或圆形分为很多个区域,则每一个地址位置会映射到一个区域。并预处理好一个区域内所含的油站。

首先判断你所在的区域,然后在该区域内捞取油站,获取最近的,若没有则向外拓展寻找。

  • 不断缩小范围

借助数据库,存入油站的地理位置。

首先任意选一个油站计算距离d,然后利用数据库的索引(b+树复杂度log级别,时间主要是io吧,存在内存里的话可以二分,可以建树等)排除x轴距离大于d的,排除y轴距离大于d的(这里还可以做缓存优化)。在命中的油站中继续重复这个操作。

最后排除不了时再较小数量的油站中全扫描遍历除距离最小的。

大佬们的解法

  • 空间索引算法:Geohash,s2,h3

例如Geohash,其实类似我分块的方法,他主要就是做了如何分块(编码)。

GeoHash是一种地址编码方法。他能够把二维的空间经纬度数据编码成一个字符串

参考:www.jianshu.com/p/2fd0cf12e…

  • KD Tree

类似我第二种解法了,不断按某一维度切分数据。关键在于他可以找出具体按哪个维度(x还是y),哪个值切分最优

  • VP Tree

和KD Tree差不多