Skip to content

Commit eaf0205

Browse files
committed
图的表示
1 parent 243656e commit eaf0205

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

docs/18_图与图的遍历/bfs.png

47.6 KB
Loading

docs/18_图与图的遍历/graph.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,41 @@
1515
# 图的表示
1616
那我们怎么把一个图抽象成代码来表示呢?因为最终我们还是需要代码来实现的。通常有两种表示方法,邻接表法和邻接矩阵表示。
1717

18+
![](./graph_rep.png)
1819

20+
- 邻接表法:对于每个图中的点,将它的邻居放到一个链表里
21+
- 邻接矩阵:对于 n 个点,构造一个 n * n 的矩阵,如果有从点 i 到点 j 的边,就将矩阵的位置 matrix[i][j] 置为 1.
1922

23+
不过我们可以看到,用矩阵存储图是非常耗费空间的,大部分情况下矩阵是稀疏的,所以我们后边选择使用邻接表。
2024

25+
# 图的遍历
26+
遍历图最常用的有两种方式,就是你常听到的 BFS 和 DFS.
27+
28+
- BFS: Breadth First Search,广度优先搜索
29+
- DFS: Depdth First Search,深度优先搜索
30+
31+
### BFS
32+
BFS 类似于树的层序遍历,从第一个节点开始,先访问离 A 最近的点,接着访问次近的点。我们先来构造一个图:
33+
34+
```py
35+
graph = {
36+
'A': ['B', 'F'],
37+
'B': ['C', 'I', 'G'],
38+
'C': ['B', 'I', 'D'],
39+
'D': ['C', 'I', 'G', 'H', 'E'],
40+
'E': ['D', 'H', 'F'],
41+
'F': ['A', 'G', 'E'],
42+
'G': ['B', 'F', 'H', 'D'],
43+
'H': ['G', 'D', 'E'],
44+
'I': ['B', 'C', 'D'],
45+
}
46+
```
47+
如何『由近及远』地访问节点呢?我们先访问起点 A 的邻居,然后邻居访问完再访问邻居的邻居不就行了?
48+
就是这个思想,不过我们需要一个队列辅助,队列之前说过是一种先进先出结构,我们只需要把起点的邻居先入队,
49+
当邻居访问完了再去访问邻居的邻居就可以了,对于已经访问过的节点,我们用一个 set 记录它就好了。
50+
51+
52+
![](./bfs.png)
2153

2254
# 思考题
2355

86.6 KB
Loading

0 commit comments

Comments
 (0)