今天看了funlncde的数之道的关于BFS、DFS、、A*、Dijkstra's的讲解,记录一下
FunInCodehttps://space.bilibili.com/152254793
-
广度优先搜索 (BFS):
- BFS是一种从起始节点开始,逐层遍历所有相邻节点的搜索策略。
- 在无权图中,它用于寻找从源点到其他所有节点的最短路径,这里的“最短”指的是边的数量最少。
- 实现方式通常采用队列结构,先访问当前层的所有节点,再进入下一层节点。
-
深度优先搜索 (DFS):
- DFS是一种沿着树的深度方向尽可能深地搜索,当达到叶子节点后回溯至下一个未完全探索过的分支继续搜索的策略。
- DFS不保证找到的是最短路径,但常用于拓扑排序、查找图中是否有环以及求解迷宫等问题。
- 实现方式通常使用栈,先进后出的原则使得搜索能深入到图的深处。
-
A*搜索:
- A*是一种启发式搜索算法,主要用于寻找从起点到终点的最短路径,特别是在有权图中。
- 它结合了目标距离估计(heuristic function)和实际走过的代价来决定下一步要扩展哪个节点,目标是尽快找到最优解。
- A*需要一个估价函数f(n) = g(n) + h(n),其中g(n)是从起始节点到当前节点的实际代价,h(n)是从当前节点到目标节点的最佳猜测代价。
-
迪杰斯特拉算法 (Dijkstra's Algorithm):
- Dijkstra算法是一种解决单源最短路径问题的经典算法,在加权有向图和无向图中都能找到从给定起点到所有其他顶点的最短路径。
- 这个算法保持了一个优先队列,每次都选择当前已知距离最小的节点进行拓展,并更新与其相邻节点的距离。
- 算法假设图中所有的边权重都非负,如果存在负权重边,则不能使用Dijkstra算法。
例子:
广度优先
深度优先
A*
以上是个简单例子,通俗来讲:广搜的时候只需要把相邻的点一股脑添加到队列里面,而A*在加到队列的时候对每个相邻点用评估函数评估了一下,找到最优点,加入队列,而迪杰斯特拉则时仅考虑G,搜索面更广,适合多点搜索。
仅个人理解,如有问题,欢迎纠正,如有侵权,请联系删除。