Java数据结构与算法15——带权图

1.什么是权

权可以给图中的边设置权值,用来代表一定的含义,比如:交通图中可以设置边的权为距离,当然也可以是交通流量等等。

带权图可以用来处理很多有趣的实际问题,比如:两个城市之间的最短距离,或者造价最低的工程路线等等。

2.带权图的最小生成树

就是权值总和最小的生成树。

3.普里姆算法,代码示例

普里姆算法步骤:

  • step1.任取一个顶点,放入树的集合中
  • step2.找到这个顶点到其他顶点的所有的边,当然这些其他顶点不能在树的集合中,把这些边放入优先级队列中
  • step3.找到权值最小的边,把它和它所到达的顶点放入树的集合中,重复2和3,直到所有顶点都在树的集合中。

4.最短路径问题

最短路径问题带权图的一个常见应用就是用来求从一个顶点到另外顶点的最小XX的问题,比如:最短路径、最便宜的费用、最少的总时间等等。

5.迪杰斯特拉算法,代码示例

迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是求从一个顶点到其余各顶点的最短路径的算法,解决的正是有向图中的最短路径问题。算法步骤如下:

  • step1.创建一个额外的数组sPath,用来保持源点到其他顶点的最短路径,这些值在算法开始的时候,就是相应边的权值,算法运行过程中是不断变化的,最后它存储的是从源点到其他顶点的真正的最短路径
  • step2.把第一个顶点放入树中,同时给sPath赋初始值
  • step3.进入循环,直到所有的顶点都放入树中就结束
  • step4.在循环中,先选择sPath中的最小距离
  • step5.把对应的顶点放入树中,设置这个顶点为当前顶点
  • step6.根据新的当前顶点,更新sPath的内容,然后继续循环

6.弗洛伊德算法,代码示例

每对顶点间的最短路径问题一个解决方案就是循环用每个顶点作为起始点,去使用迪杰斯特拉算法进行计算,最后把结果汇总起来。

另外一个方案就是采用Floyd算法:
弗洛伊德(Floyd)算法又称为插点法,是一种用于在加权图中,求顶点之间最短路径的算法。其算法和Warshall算法类似,只不过在找到两端路径后,这里需要插入两端路径的权值之和,并保持这个权值始终最小即可

7.稀疏图和稠密图

边较少(多)的图称为稀疏图(稠密图)。

8.图的效率

1.用邻接矩阵实现的图,大多是O(N^2),N是顶点个数
2.在稀疏图中,用邻接表的方式来代替邻接矩阵,可以提高效率
3.无权图,邻接表的深度优先搜索需要O(N+E),N是顶点个数,E是边的个数
4.带权图,最小生成树算法和最短路径算法都需要O((E+N)logN)
5.Warshall算法和Floyd算法都需要O(N^3)

参考

  • 1)Java数据结构和算法精讲版

你可能感兴趣的:(Java数据结构与算法15——带权图)