This commit is contained in:
krahets
2023-08-22 13:50:12 +08:00
parent 0c9bf14e20
commit 92a0853ab8
64 changed files with 478 additions and 479 deletions
+7 -7
View File
@@ -8,7 +8,7 @@ comments: true
## 9.2.1   基于邻接矩阵的实现
给定一个顶点数量为 $n$ 的无向图,则各种操作的实现方式如图所示。
给定一个顶点数量为 $n$ 的无向图,则各种操作的实现方式如图 9-7 所示。
- **添加或删除边**:直接在邻接矩阵中修改指定的边即可,使用 $O(1)$ 时间。而由于是无向图,因此需要同时更新两个方向的边。
- **添加顶点**:在邻接矩阵的尾部添加一行一列,并全部填 $0$ 即可,使用 $O(n)$ 时间。
@@ -30,7 +30,7 @@ comments: true
=== "删除顶点"
![adjacency_matrix_remove_vertex](graph_operations.assets/adjacency_matrix_remove_vertex.png)
<p align="center"> 图邻接矩阵的初始化、增删边、增删顶点 </p>
<p align="center"> 图 9-7 &nbsp; 邻接矩阵的初始化、增删边、增删顶点 </p>
以下是基于邻接矩阵表示图的实现代码。
@@ -1126,7 +1126,7 @@ comments: true
## 9.2.2 &nbsp; 基于邻接表的实现
设无向图的顶点总数为 $n$ 、边总数为 $m$ ,则可根据图所示的方法实现各种操作。
设无向图的顶点总数为 $n$ 、边总数为 $m$ ,则可根据图 9-8 所示的方法实现各种操作。
- **添加边**:在顶点对应链表的末尾添加边即可,使用 $O(1)$ 时间。因为是无向图,所以需要同时添加两个方向的边。
- **删除边**:在顶点对应链表中查找并删除指定边,使用 $O(m)$ 时间。在无向图中,需要同时删除两个方向的边。
@@ -1149,7 +1149,7 @@ comments: true
=== "删除顶点"
![adjacency_list_remove_vertex](graph_operations.assets/adjacency_list_remove_vertex.png)
<p align="center"> 图邻接表的初始化、增删边、增删顶点 </p>
<p align="center"> 图 9-8 &nbsp; 邻接表的初始化、增删边、增删顶点 </p>
以下是基于邻接表实现图的代码示例。细心的同学可能注意到,**我们在邻接表中使用 `Vertex` 节点类来表示顶点**,这样做的原因有:
@@ -2114,9 +2114,9 @@ comments: true
## 9.2.3 &nbsp; 效率对比
设图中共有 $n$ 个顶点和 $m$ 条边,表对比了邻接矩阵和邻接表的时间和空间效率。
设图中共有 $n$ 个顶点和 $m$ 条边,表 9-2 对比了邻接矩阵和邻接表的时间和空间效率。
<p align="center"> 表邻接矩阵与邻接表对比 </p>
<p align="center"> 表 9-2 &nbsp; 邻接矩阵与邻接表对比 </p>
<div class="center-table" markdown>
@@ -2131,4 +2131,4 @@ comments: true
</div>
观察表,似乎邻接表(哈希表)的时间与空间效率最优。但实际上,在邻接矩阵中操作边的效率更高,只需要一次数组访问或赋值操作即可。综合来看,邻接矩阵体现了“以空间换时间”的原则,而邻接表体现了“以时间换空间”的原则。
观察表 9-2 ,似乎邻接表(哈希表)的时间与空间效率最优。但实际上,在邻接矩阵中操作边的效率更高,只需要一次数组访问或赋值操作即可。综合来看,邻接矩阵体现了“以空间换时间”的原则,而邻接表体现了“以时间换空间”的原则。