相比较贝尔曼-福特算法需要每次对所有边进行松弛操作,时间复杂度为O(顶点数*边数),并且可以处理负权边,但是我们在实际生活中,计算路径的时候,极少遇到负权边的情况,所以只考虑正权边的情况下,可以采用更优化的Dijkstra算法。

Dijkstra算法设置了两个集合,设所有顶点集合为V,则:

S=所有与起点s已经确定最短路径、最低权重值的顶点。

W=V-S。

算法每次都将W中权重值最小的顶点u移入S中,并对u的所有边进行松弛操作。

看图说话:

初始化:

S=A0W=B∞,C∞,D∞,E∞,F∞,G∞

1、需要对A的所有边进行松弛操作,结果

S=A0W=B6,C4,D∞,E∞,F∞,G∞

2、取出W中最小的顶点C放入S,并对C所有边进行松弛操作,结果

S=A0,C4W=B6,D9,E∞,F11,G∞

3、取出W中最小顶点B放入S,并对B所有边进行松弛操作,结果

S=A0,B6,C4W=D9,E11,F11,G∞

4、取出W中最小的顶点D放入S,并对D所有边进行松弛操作,结果

S=A0,B6,C4,D9W=E11,F10,G∞

5、取出W中最小的顶点F放入S,并对F所有边进行松弛操作,结果

S=A0,B6,C4,D9,F10W=E11,G∞

6、取出W中最小的顶点E放入S,并对E所有边进行松弛操作,结果

S=A0,B6,C4,D9,E11,F10W=G∞

7、取出W中最小的顶点G放入S,并对G所有边进行松弛操作,结果

S=A0,B6,C4,D9,E11,F10,G∞

至此,我们可以得出一个最短路径树:

A——B=6A——C=4A——C——D=9A——B——E=11A——C——D——F=10A无法到达G

在这里有两个地方可以优化:

1、因为要取出权重最小的顶点,所以每次都要对W进行排序,采用遍历数组进行比较的算法,不如采用优先队列(PriorityQueue),因为优先队列采用了堆结构,排序时间复杂度是O (nlgn)。

2、如果我们只是想计算起点到某点的最短距离,那么在遍历的时候,检查一下取出的最小顶点是否是终点,如果是,跳出循环即可。

©著作权归作者所有:来自51CTO博客作者mb5fe559d8b9ae4的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 被裁老程序员再就业计划之我可以用Dijkstra算法在回龙观送外卖
  2. Android 自定义View 仿蚂蚁信用分析(正多边形)
  3. Android OpenGL ES 基础:绘制三角形
  4. Qt for Android调用Android接口将程序移到后台/前台运行
  5. 学习OpenGL ES for Android(二)
  6. android listView的开启滑块及最小页数解决办法
  7. android 3D系列之基本概念篇
  8. 2019最新Android算法相关面试大全,请查收
  9. ndk-build编译出错:Android NDK: APP_PLATFORM not set. Default

随机推荐

  1. Android中设置关键字高亮的方法
  2. android计时demo源代码
  3. 新建Cocos2dx-Android工程
  4. android 动态添加View
  5. Android高级工程师成长路线
  6. Android :Process xxxxx (pid xxxxx) has
  7. Android在Log中打印出当前的调用栈
  8. Android自学笔记(番外篇):全面搭建Linux环境
  9. Android中回调接口的使用
  10. android——android中测试框架AndroidTes