6 回答
TA贡献1872条经验 获得超4个赞
换个角度看下你的问题。
既然现在的地图app都是毫秒级返回,那么计算肯定不是在请求后才进行(或部分进行),那必然有缓存。
理论上点构成线,是点的全排列,但可以排除很多无用的线,比如不可达(不认为有现实意义的不可达,应该算代价大小)
举例:程序运行一年后,发现某地区计算最多的是道路C-A-I,Y-O-N-G,J-I,那这部分可以缓存起来。现实中想去某个地方,你脑海里不会有太多“路的走法”,也就是说每单次请求并没有太多元素需要计算,更谈不上全排列。
如果我来设计,我会多设计一个概念“优先级”,来将地点/线路等概念(元素)进行区别对待。
假设一座城市有Pa-Pz主要地点,P1-P10000次要地点。
Ra-Rz主要道路,R1-R10000次要道路。
缓存Pa-Pz间全排列路径(地点间走法)。
缓存Ra-Rz间所有途径点,记录距离,权重等信息。
计算任意地点间路径逻辑:
计算地点A到主要地点路径,走法。
计算地点B到主要地点路径,走法。
连通,得到n条路径(点序列)。
以上是初步结果,再对结果进行纠正(条件导入):
遍历点序列,并跟据单点辐射范围道路,进行最短路径优化选择。
将其缓存或计入日志方便日后统计。
TA贡献1825条经验 获得超6个赞
【建议】
这个问题我没看懂,但是从算法角度提出几个建议,方便LZ更快地找到答案:
数据库中存储了一些点元素【A,B,C...,Z】以及构建与点元素之上的线元素【AB,BC,...,YZ】
可否说下数据量,点元素数据量,边的数据量,以及数据量的在大小极值之间的分布。抱歉,我是刷oj刷多了,所以。。。。。。因为算法是建立在 “问题 + 数据” 之上的。
TA贡献1854条经验 获得超8个赞
2017年6月19日补充
虽然解空间的边元素一开始就存在了,但对于用户的一个特定的最短路径请求而言,这其实是个伪边,因为还要满足与起止节点一起传过来的特定约束才能算作解空间的候选边。
又考虑到满足约束即算可达,所有候选边权重均为1,所以实际上这里的Dijkstra算法就简化成了一个边元素需要动态计算的图的广度优先遍历问题。
不知道我这样简化问题逻辑是不是有盲点?是不是还有比广度优先更简单的解法呢?
另:实际业务场景中的点元素大概在1万~10万左右,放在代码内存中有点担心内存爆炸。。。
添加回答
举报
