This commit is contained in:
krahets 2023-02-15 04:33:11 +08:00
parent 26f3ad7b2e
commit 530419c006
2 changed files with 5 additions and 7 deletions

View file

@ -632,13 +632,11 @@ comments: true
=== "删除顶点" === "删除顶点"
![adjacency_list_remove_vertex](graph_operations.assets/adjacency_list_remove_vertex.png) ![adjacency_list_remove_vertex](graph_operations.assets/adjacency_list_remove_vertex.png)
基于邻接表实现图的代码如下所示。 基于邻接表实现图的代码如下所示。细心的同学可能注意到,**我们在邻接表中使用 `Vertex` 结点类来表示顶点**,这样做的原因是:
!!! question "为什么需要使用顶点类 `Vertex` " - 如果我们选择通过顶点值来区分不同顶点,那么值重复的顶点将无法被区分。
- 如果类似邻接矩阵那样,使用顶点列表索引来区分不同顶点。那么,假设我们想要删除索引为 $i$ 的顶点,则需要遍历整个邻接表,将其中 $> i$ 的索引全部执行 $-1$ ,这样操作效率太低。
如果我们直接通过顶点值来区分不同顶点,那么值重复的顶点将无法被区分。 - 因此我们考虑引入顶点类 `Vertex` ,使得每个顶点都是唯一的对象,此时删除顶点时就无需改动其余顶点了。
如果建立一个顶点列表,用索引来区分不同顶点,那么假设我们想要删除索引为 `i` 的顶点,则需要遍历整个邻接表,将其中 $> i$ 的索引全部执行 $-1$ ,这样的操作是比较耗时的。
因此,通过引入顶点类 `Vertex` ,每个顶点都是唯一的对象,这样在删除操作时就无需改动其余顶点了。
=== "Java" === "Java"

View file

@ -24,7 +24,7 @@ BFS 常借助「队列」来实现。队列具有“先入先出”的性质,
1. 将遍历起始顶点 `startVet` 加入队列,并开启循环; 1. 将遍历起始顶点 `startVet` 加入队列,并开启循环;
2. 在循环的每轮迭代中,弹出队首顶点弹出并记录访问,并将该顶点的所有邻接顶点加入到队列尾部; 2. 在循环的每轮迭代中,弹出队首顶点弹出并记录访问,并将该顶点的所有邻接顶点加入到队列尾部;
3. 循环 `2.` ,直到所有顶点访问完成后结束 3. 循环 `2.` ,直到所有顶点访问完成后结束
为了防止重复遍历顶点,我们需要借助一个哈希表 `visited` 来记录哪些结点已被访问。 为了防止重复遍历顶点,我们需要借助一个哈希表 `visited` 来记录哪些结点已被访问。