图算法(python)

图结构实现

邻接矩阵和邻接表

https://blog.csdn.net/qq_29681777/article/details/84202039
可见用邻接矩阵表示图的方式所需的空间开销是和图的顶点数的平方成正比的,如果图的顶点数比较多,并且图的每个顶点的度并不多,这样邻接矩阵就是一个稀疏矩阵,其中大部分元素都是无用的,反而耗费了大量的存储空间。另外,也不便添加顶点。
这种表示图的方式更加节省空间,且插入顶点操作比较简单。但由于每个顶点的边表的元素是按终点的编号排序的,因此在插入边时,需要从头遍历该列表,在一定程度上增加了算法的复杂度。

遍历

广度遍历同树
深度遍历递归与非递归
https://www.cnblogs.com/tsdblogs/p/9765118.html

A*算法

f=g+h来判别路径,g是起点经过距离,h是到终点的估计,需要小于等于实际距离
无负边,求路径
A*算法主要是有两张表, 一个open表,一个是close表。

  1. 将起点加入open表。
  2. a)遍历open list,找F(F = G + H)值最小的节点,把他作为当前要操作的节点;
  3. b)把这个节点移到close list;
  4. c)把当前操作节点周围的8个节点放到open list中(除了不可达的节点,比如墙、禁飞区等);
  5. d)重复上述操作,每次都去F值最小的节点作为当前操作节点。
  6. 当终点加入到close表中的时候停止。
  7. 保存路径,从终点开始,每个节点沿着父节点移动到起点,就是最终路径。
    上面F = G + H中:H是启发函数,是当前点到终点距离的估计,一般采用曼哈顿距离(当前点和终点横纵坐标差之和);G就是起点到当前点的距离,这里G值的度量方式一般是上下左右取一个值比如10,对角线的四个点取一个值比如14(一般比上下左右的值要大),而在A*中表示障碍点一般会给对应点一个特别大的G值,所以在筛选的时候就会放掉

dijkstra算法

dijkstra就是保证当前节点的值对于前面的层一定是最优的(不管后面有啥只往前看),所以最后到终点的时候,可以保证终点到前一层选一个最优的点,这样从终点到起点一直选当前最小得到的路径一定是最优的。

比较:
1.Dijkstra算法计算源点到其他所有点的最短路径长度,A关注点到点的最短路径(包括具体路径)。
2.Dijkstra算法建立在较为抽象的图论层面,A
算法可以更轻松地用在诸如游戏地图寻路中。
3.Dijkstra算法的实质是广度优先搜索,是一种发散式的搜索,所以空间复杂度和时间复杂度都比较高。对路径上的当前点,A算法不但记录其到源点的代价,还计算当前点到目标点的期望代价,是一种启发式算法,也可以认为是一种深度优先的算法。
4.由第一点,当目标点很多时,A
算法会带入大量重复数据和复杂的估价函数,所以如果不要求获得具体路径而只比较路径长度时,Dijkstra算法会成为更好的选择。
5.A算法和Dijistra算法的区别在于有无估价值,Dijistra算法相当于A算法中估价值为0的情况。

Dijkstra算法适用于边权为正的无向和有向图,不适用于有负边权的图!求多点路径长度
用于求图中指定两点之间的最短路径,或者是指定一点到其它所有点之间的最短路径。实质上是贪心算法。

Bellman-Ford

求单源最短路,可以判断有无负权回路(若有,则不存在最短路),
给定图G(V, E)(其中V、E分别为图G的顶点集与边集),源点s,数组Distant[i]记录从源点s到顶点i的路径长度,初始化数组Distant[n]为, Distant[s]为0;以下操作循环执行至多n-1次,n为顶点数:
对于每一条边e(u, v),如果Distant[u] + w(u, v) < Distant[v],则另Distant[v] = Distant[u]+w(u, v)。w(u, v)为边e(u,v)的权值;
若上述操作没有对Distant进行更新,说明最短路径已经查找完毕,或者部分点不可达,跳出循环。否则执行下次循环;为了检测图中是否存在负环路,即权值之和小于0的环路。对于每一条边e(u, v),如果存在Distant[u] + w(u, v) < Distant[v]的边,则图中存在负环路,即是说改图无法求出单源最短路径。否则数组Distant[n]中记录的就是源点s到各顶点的最短路径长度。可知,Bellman-Ford算法寻找单源最短路径的时间复杂度为O(V*E).

Floyd - Warshall

多源最短路径
这个代码的基本思路就是我们从最开始的只允许经过1号顶点进行中转,接下来只允许1,2进行中转。。。。。允许经过1~n 号所有的顶点进行中转,求任意两点的最短路径。三重循环
https://blog.csdn.net/yuewenyao/article/details/81021319

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值