0 关于文章
这篇文章是我从自己的csdn上扣下来的,可能会有些格式错误。
另外,因为本人不会画图不想画图,就从别人那里扣来了一些图,如果有争议,请联系作者:
C20204429
1 概述与引例
A*算法是一个寻径算法
相信同学们都玩过某种游戏LOL人在塔在!!! ,在你用鼠标点击地面的某个地方的时候,你所操控的人物会十分智能地寻找一条最短的路前进到你所指定的位置,不论范围大小,这种算法都很快。
1.1 类似最短路算法类比
看完这样一个功能,似乎实现起来很简单
似乎我们也可以制作这样一个功能,想一想我们所学过的一些算法:
- floyd算法
这似乎是一个十分简单的算法,可以解决多源点的问题,利用中转点的思想和一个效率十分低的三重循环,但是由于其效率太低(三重循环,时间复杂度O(n^3)),你其实可以使用这个来制作这样一个功能,也挺方便的是不是啊?把一个大型多人联机实战游戏卡成了PPT,最多也就是玩家把你这个制作者吊起来打一顿“而已” - dijkstra算法
这个算法的效率十分不错,使用了一个叫做“松弛”的操作与一个g()数组记录起点到格子的最短距离,时间复杂度O(n^2),但是如果使用堆优化,可以变成O(n*log(n)),已经完全可以接受了,但是唯一的缺点是不接受负权边。
其实负权边也可行,只要用玄学修改算法,可以保证正确性但是会被魔学的出题人卡成指数。语出 APOI2013出题人 - SPFA算法
这个算法据说是bellman-ford算法的改进版感人的是这个算法是一个中国伟大的专家提出的!!!,时间复杂度在O(n*m),这个算法是由一个点进行发散,代码和dijkstra算法很像有一段时间我居然把它和dijkstra算法搞混了,它可以支持负权边,但是不支持负环,它没有dijkstra算法太刻板,前者虽不支持负环,但是可以判定并退出,但是后者似乎在负边上就跑不起来
1.2 BFS算法的引入、对比与问题的出现
在1.1中,我们发现似乎三个算法中,dijkstra算法是十分高效的,时间复杂度只有O(n*log(n))
那么我们就从dijkstra算法中开始研究
这里新增一个在没有路障的情况下高效得不能再高效的算法
- BFS算法
呃?这不是搜索里面的吗?怎么到这里来了?
这个算法的全名叫做Best-First Search,和BFS(Breadth-First Search)不一样。
这是一个很贪心的算法,具体的可以看下面的图来对比一下: - 这是dijkstra算法所找到的
正常的最短路(笔者不会画图,就借了下别人的图):
前文提到,dijkstra算法使用了g()数组来记录从起点到这个格子的距离,在此图中,一目了然的就是“格子越黑,其离起点越近”,而后面的dijkstra算法模拟图也是这个道理。
当然,