BFS(Breath First Search,广度优先算法)和DFS(Depth First Search,深度优先算法)是非常常用的两种算法,其中DFS通常被认为是“回溯算法”。
BFS相对DFS的最大区别是:BFS找到的路径一定是最短的,但代价是空间复杂度比DFS大很多。
BFS的核心思想:把一个问题抽象成图,从一个点开始,向四周扩散。通常BFS算法都是需要“队列”这种数据结构,把一个点周围的点加入这个队列。
算法框架
int BFS(Node start, Node end) {
Queue<Node> queue = new LinkedList<>(); // 核心数据结构
Set<Node> visited = new HashSet<>(); // 避免走回头路
queue.offer(start);
visited.add(start);
int step = 0;
while (!queue.isEmpty()) {
int size = queue.size();
// 将当前队列中的所有点向周围扩散
for (int i = 0; i < size; i++) {
Node node = queue.poll();
// 判断是否到达终点
if (node == end) {
return step;
}
// 将当前点周围的点都加入队列
for (Node newNode : node.adj()) {
if (!visited.contains(newNode)) {
queue.offer(newNode);
visited.add(newNode);
}
}
}
step++;
}
return step;
}
练习题目: