一个面试题,当时头脑不清楚,回答的不好,特此总结一番。油站数量百万级,范围全国范围,不限数据结构或工具。
在面试回答解法:
- 分块
全国的地区按方形或圆形分为很多个区域,则每一个地址位置会映射到一个区域。并预处理好一个区域内所含的油站。
首先判断你所在的区域,然后在该区域内捞取油站,获取最近的,若没有则向外拓展寻找。
- 不断缩小范围
借助数据库,存入油站的地理位置。
首先任意选一个油站计算距离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差不多