Skip to content

Commit

Permalink
Update 01.Queue-BFS.md
Browse files Browse the repository at this point in the history
  • Loading branch information
itcharge committed Dec 21, 2021
1 parent a3c646b commit 5d94230
Showing 1 changed file with 85 additions and 0 deletions.
85 changes: 85 additions & 0 deletions Contents/04.Queue/02.Queue-BFS/01.Queue-BFS.md
Original file line number Diff line number Diff line change
@@ -1 +1,86 @@


## 1. 广度优先搜索简介

> **广度优先搜索算法**(Breadth First Search):简称为 BFS,又译作宽度优先搜索 / 横向优先搜索。是一种用于遍历或搜索树或图的算法。该算法从根节点开始,沿着树的宽度遍历树或图的节点。如果所有节点均被访问,则算法中止。
广度优先遍历类似于树的层次遍历过程。呈现出一层一层向外扩张的特点。先看到的节点先访问,后看到的节点后访问。遍历到的节点顺序符合「先进先出」的特点,所以广度优先搜索可以通过「队列」来实现。

## 2. 广度优先搜索过程演示

接下来我们以一个无向图为例,演示一下广度优先搜索的过程。

我们用邻接字典的方式存储无向图结构,对应结构代码如下:

```Python
# 定义无向图结构
graph = {
"A": ["B", "C"],
"B": ["A", "C", "D"],
"C": ["A", "B", "D", "E"],
"D": ["B", "C", "E", "F"],
"E": ["C", "D"],
"F": ["D"]
}
```

该无向图的结构如图左所示,图右为宽度优先搜索的遍历路径。

其对应的动态演示图如下所示。

## 3. 基于队列实现的广度优先搜索

### 3.1 基于队列实现的广度优先搜索实现步骤

1. `graph` 为存储无向图的字典变量,`start` 为开始节点。
1. 然后定义 `visited` 为标记访问节点的 set 集合变量。定义 `q` 为存放节点的队列。
1. 首先将起始节点放入队列 `q`中,即 `q.put(start)`。并将其标记为访问,即 `visited.add(start)`
4. 从队列中取出第一个节点 `node_u`。访问节点 `node_u`,并对节点进行相关操作(看具体题目要求)。
2. 遍历与节点 `node_u` 相连并构成边的节点 `node_v`
- 如果 `node_v` 没有被访问过,则将 `node_v` 节点放入队列中,并标记访问,即 `q.append(node_v)``visited.add(node_v)`
6. 重复步骤 4 ~ 5,直到 `q` 为空。

### 3.2 基于队列实现的广度优先搜索实现代码

```Python
from queue import Queue

def bfs(graph, start):
visited = set(start)
q = Queue()
q.put(start)
while not q.empty():
node_u = q.get()
print(node_u)
for node_v in graph[node_u]:
if node_v not in visited:
visited.add(node_v)
q.put(node_v)
```

## 4. 广度优先搜索应用

### 4.1 岛屿的最大面积

#### 4.1.1 题目链接

- [695. 岛屿的最大面积 - 力扣(LeetCode)](https://leetcode-cn.com/problems/max-area-of-island/)

#### 4.2.2 题目大意

给定一个只包含 `0``1` 元素的二维数组 `grid`,其中 `1` 代表岛屿,`0` 代表水。一座岛的面积就是上下左右相邻的 `1` 所组成的连通块的数目。

要求:计算出最大的岛屿面积。

#### 4.2.3 解题思路

#### 4.2.4 代码

```Python

```

## 参考资料

- 【文章】[广度优先搜索 - LeetBook - 力扣(LeetCode)](https://leetcode-cn.com/leetbook/read/bfs/e69rh1/)

0 comments on commit 5d94230

Please sign in to comment.