基本的数据存储:
对所有站点建站点到路线的索引,例如1路,2路,3路车都经过站点A,A的倒排就是A对应1路,2路,3路(这个不用过多解释吧)
以一个简单的例子来做说明
先看一个最简单的情景 :搜索从 站点A 到 站点B 的 路线
从站点A 到 站点B 可以怎么做:
首先会想到直达:求A的倒排和B的倒排的交集
其次是一次换乘:
经过站点A的所有路线所包含的的站点和经过站点B的所有路线的站点的交集可以是换乘站点。
二次换乘:和一次换乘差不多(不用多少了吧,自己想象)
这样,公交换乘的核心算法就有了
但是,用户想从一个地方到另外一个地方大部分情况下他不会知道应该从哪个站点到哪个站点,他会搜索从一个地方到另外一个地方的路线,这该怎么做呢:
这就需要大量的数据做支撑。需要大量数据的经纬度信息,首先就是站点的经纬度信息,其次就是大量地标的经纬度信息。公交站点的数据信息和大量坐标的信息都可以从百度地图上或其他站点上抓取,还好公司是做附近搜索的,积累了的大量的高质量的地标数据。
这时候应该怎么做呢:
建立坐标索引。
如上图所示,将一个地区划分为足够小的块,为每一个块建立索引,每个块对应一个地标的集合。
其中A和B为起点和终点,a, b, c, d, e, f, m 为站点
现在要查从地点A到地点B的乘车路线,根据索引,找到b站点和d站点,转化成从b站点到d站点的查找,当然同时可以计算出从A到b的步行距离, B到d的步行距离。
以上就是公交换乘的核心算法。当然这只是一个框架,需要换乘方案更好的话,肯定需要很多细节的补充,例如等车时间的估算,换乘次数和步行距离的一个平衡,时间的一个平衡,地铁和公交车的一个平衡,这些都需要大量细节的补充,甚至需要一个一个特例的去解决。
总之,就像谷歌说的,我们没有什么牛逼的算法,但我们有你们没有的数据
有趣有爱有价值:http://www.qihu100.com