4.1什么是图
加权图:有全图表示顶点的连接程度。而无权的边只能表示两个顶点的连接状态。
有向图:边带上箭头的图叫有向图。
本章注重学习图的搜索算法和解决图的基本问题——最短路径问题的算法。
4.2广度优先搜索
广度优先搜索是一种对图进行搜索的算法。即从起点开始,优先从离起点近的顶点开始到离起点远的顶点。
4.3深度优先搜索
深度优先搜索会沿着一条路径不断往下搜索直到不能再继续为止,然后再折返,开始搜索下一条候补路径。
两者区别:广度优先搜索选择最早成为候补的顶点,因此从离起点近的地方开始按顺序搜索;而深度优先搜索选择最新成为候补的顶点,沿着新发现的路径不断深入搜索。
4.4贝尔曼-福特算法
贝尔曼-福特算法是一种在图中求解最短路径问题的算法。即在边加权的情况下,求从起点到终点权重和最小的那条路径。
方法:
- 将除起点外的顶点权设置为无穷大,起点设置为0;
- 假设起点为A,临近的点为B,C,那么计算从这一端到那边一端的权重,计算方法是“顶点原本的权重+边权重”,但要从两边分别计算,所得权重与原权重进行比较,当边上的权重不为负数时,取较小者为新权重。
- 自己可以从靠近左边起点的边来一条一条地更新权重。
- 进行完第一轮更新后要进行第二轮更新,直至不能更新。
若图顶点数为n,边数为m。该算法经过n轮更新后就会停止,因此整体地时间复杂度为O(nm)。
4.5狄克斯特拉算法
狄克斯拉特算法也是求解最短路径问题的算法。
方法:
- 将起点设为0,除起点外的顶点设为无穷大。
- 将与起点相邻的顶点设为候补顶点,计算权重,与原权重进行比较,看是否更新。
- 从候补顶点中选出权重最小的顶点,选择它相邻的 以及上一回合中除去权重最小 的顶点作为新的候补顶点,重复第二步。直至完成将所有的顶点都设为候补顶点。
图的顶点设为n,边数设为m,若不事先进行任何处理,那么该算法的复杂度为O(n^2)。若事先对数据结构进行优化,那么时间复杂度就会变为O(m+nlog n)。
区别:当图中有负数权重时,狄克斯特拉算法可能无法得出正确答案,而贝克曼-福特算法则正确。
4.6 A*算法
A*算法也是求解最短路径的算法,由狄克斯特拉算法发展而来。狄克斯特拉算法算法会把到各个顶点的最短路径都算出来,但咱们有时只需要一个,其他顶点对咱们来说是无用的。A*算法就是预先估算一个值,并利用这个值来省去一些无用的计算。
方法:狄克斯特拉算法从起点开始更新起点附近的顶点的权重。在更新距离的过程中,我们会发现一些路径上的顶点其实离终点越来越远。而A*算法就会考虑从起点到候补顶点的距离。我们可以综合考虑顶点到起点的距离和到终点的距离,然后再计算其权重。
当我们可以用一些信息来估算各个顶点到终点的大致距离时,我们就可以使用A*算法。当然,有时这些信息完全无法估算的,这时就无法使用A*算法。