最短路径:地图软件是如何计算出最优出行路径的?.pdfVIP

最短路径:地图软件是如何计算出最优出行路径的?.pdf

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

最短路径:地图软件是如何计算出最优出⾏路径的?

本⽂是学习算法的笔记,《数结构与算法之美》,极客时间的课程

今天,从地图软件的路径规划问题讲起,带你看看常⽤的最短路径算法(ShortestPathAlgorithm)。

像Google地图。百度地图、⾼德地图这样的地图软件,应该会经常使⽤吧?如果从家开到公司,你只需要输⼊起始地址、结束地址,地图

就会给你规划⼀条最优路线。这⾥的最优,有很多种定义,⽐如最短路线、最少⽤时路线、最少红灯路线等等。作为⼀名软件开发⼯程师,

你是否想过,地图软件的最优路线是如何计算出来的吗?底层依赖了什么算法?

算法解析

我们刚提到的最优问题包含三个:最短路线、最少⽤时和最少红灯。我们先解决最简单的,最短路线。

解决软件开发中的实际问题,最重要的⼀点是建模,也就是将复杂的场景抽象成具体的数结构。针对这个问题,我们该如何抽象成数结

构呢?

我们之前也提到过,图这咱结构的表达能⼒很强,显然,把地图抽象成图最合适不过了。我们把每个岔路⼝看作⼀个顶点,岔路⼝与岔路⼝

之间的路看作⼀条边,路的长度就是边的权重。如果路是单⾏道,我们就在两个顶点之间画⼀条有向边;如果路是双⾏道,我们就在两顶点

之间画两条⽅向不同的边。这样,整个地图就被抽象成⼀个有向有权图。

具体的代码实现,我放在下⾯了。于是,我们要求解的问题就转化为,在⼀个有向有权图中,求两个顶点的最短路径。

publicclassGraph{//有向权图的邻接表表⽰

privateLinkedList<Edge>adj[];//邻接表

privateintv;//顶点个数

publicGraph(intv){

thisv=v;

thisadj=newLinkedList[v];

for(inti=0;i<v;i++){

thisadj[i]=newLinkedList<>();

}

}

publicvoidaddEdge(ints,intt,intw){//添加⼀条边

thisadj[s]add(newEdge(s,t,w));

}

privateclassEdge{

publicintsid;//边的起始顶点编号

publicinttid;//边的终⽌顶点编号

publicintw;//权重

publicEdge(intsid,inttid,intw){

thissid=sid;

thistid=tid;

thisw=w;

}

}

privateclassVertex{

publicintid;//顶点编号ID

publicintdist;//从起始顶点到这个顶点的距离

publicVertex(intid,intdist){

thisid=id;

thisdist=dist;

}

}

}

想要解决这个问题,有⼀个⾮常经典的算法,最短路径算法,更加准确地说,是单源最短路径算法(⼀个顶点到⼀个顶点)。提到最短路径

算法,最出名的莫过于Dijkstra算法了。所以,我们现在来看,Dijkstra算法是怎么⼯作的。咱们直接看代码。

//因为java提供的优先队列,没有暴露更新数的接⼝,所以我们需要重新实现⼀个

privateclassPriorityQueue{//根vertex,dist构建⼩顶堆

文档评论(0)

mmhaijing + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档