《我的第一本算法书》第4章 图的搜索 笔记

4.1什么是图

加权图:有全图表示顶点的连接程度。而无权的边只能表示两个顶点的连接状态。

有向图:边带上箭头的图叫有向图。

本章注重学习图的搜索算法和解决图的基本问题——最短路径问题的算法。

4.2广度优先搜索

广度优先搜索是一种对图进行搜索的算法。即从起点开始,优先从离起点近的顶点开始到离起点远的顶点。

4.3深度优先搜索

深度优先搜索会沿着一条路径不断往下搜索直到不能再继续为止,然后再折返,开始搜索下一条候补路径。

两者区别:广度优先搜索选择最早成为候补的顶点,因此从离起点近的地方开始按顺序搜索;而深度优先搜索选择最新成为候补的顶点,沿着新发现的路径不断深入搜索。

4.4贝尔曼-福特算法

贝尔曼-福特算法是一种在图中求解最短路径问题的算法。即在边加权的情况下,求从起点到终点权重和最小的那条路径。

方法:

  1. 将除起点外的顶点权设置为无穷大,起点设置为0;
  2. 假设起点为A,临近的点为B,C,那么计算从这一端到那边一端的权重,计算方法是“顶点原本的权重+边权重”,但要从两边分别计算,所得权重与原权重进行比较,当边上的权重不为负数时,取较小者为新权重。
  3. 自己可以从靠近左边起点的边来一条一条地更新权重。
  4. 进行完第一轮更新后要进行第二轮更新,直至不能更新。

若图顶点数为n,边数为m。该算法经过n轮更新后就会停止,因此整体地时间复杂度为O(nm)。

4.5狄克斯特拉算法

狄克斯拉特算法也是求解最短路径问题的算法。

方法:

  1. 将起点设为0,除起点外的顶点设为无穷大。
  2. 将与起点相邻的顶点设为候补顶点,计算权重,与原权重进行比较,看是否更新。
  3. 从候补顶点中选出权重最小的顶点,选择它相邻的 以及上一回合中除去权重最小 的顶点作为新的候补顶点,重复第二步。直至完成将所有的顶点都设为候补顶点。

图的顶点设为n,边数设为m,若不事先进行任何处理,那么该算法的复杂度为O(n^2)。若事先对数据结构进行优化,那么时间复杂度就会变为O(m+nlog n)。

区别:当图中有负数权重时,狄克斯特拉算法可能无法得出正确答案,而贝克曼-福特算法则正确。

4.6 A*算法

A*算法也是求解最短路径的算法,由狄克斯特拉算法发展而来。狄克斯特拉算法算法会把到各个顶点的最短路径都算出来,但咱们有时只需要一个,其他顶点对咱们来说是无用的。A*算法就是预先估算一个值,并利用这个值来省去一些无用的计算。

方法:狄克斯特拉算法从起点开始更新起点附近的顶点的权重。在更新距离的过程中,我们会发现一些路径上的顶点其实离终点越来越远。而A*算法就会考虑从起点到候补顶点的距离。我们可以综合考虑顶点到起点的距离和到终点的距离,然后再计算其权重。

当我们可以用一些信息来估算各个顶点到终点的大致距离时,我们就可以使用A*算法。当然,有时这些信息完全无法估算的,这时就无法使用A*算法。

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>