数据结构(八):邻接表与邻接矩阵

简介: 邻接表和邻接矩阵是图的两种常用存储表示方式,用于记录图中任意两个顶点之间的连通关系,包括权值。对于图 而言,其中 表示顶点集合, 表示边集合。
+关注继续查看
img_553969a3ce50c410df680cbbc8bf2458.jpe

邻接表和邻接矩阵是图的两种常用存储表示方式,用于记录图中任意两个顶点之间的连通关系,包括权值。

对于图 G=(V, E) 而言,其中 V 表示顶点集合,E 表示边集合。

对于无向图 graph,图的顶点集合和边集合如下:

V = \{1,2,3,4,5\}
E =\{(1,2),(1,3),(1,4),(2,3),(3,4),(3,5)\}

img_726986470f346ff425842e0a0602b78b.png
graph

对于有向图 digraph,图的顶点集合和边集合如下:

V = \{1,2,3,4,5\}
E =\{<1,2>,<1,3>,<1,4>,<2,3>,<3,1>,<3,5>,<4,3>\}

img_c332765b9a1fb1907130f951349425a2.png
digraph

邻接表

无向图 graph 表示

img_5d4cfc9ac9ba3627737b4fca2a7835ca.png
graph_adjacency_list

有向图 digraph 表示

img_57d12e56c929c84c14248ac0939c7c2e.png
digraph_adjacency_list

若采用邻接表表示,则需要申请 |V| 个列表,每个列表存储一个顶点出发的所有相邻顶点。如果图 G 为有向图,则 |V| 个列表存储的总顶点个数为 |E|;如果图 G 为无向图,则 |V| 个列表存储的总顶点个数为 2 |E|(暂不考虑自回路)。因为需要申请大小为 |V| 的数组来保存节点,对节点分配序号,所以需要申请大小为 |V| 的额外存储空间,即邻接表方式的存储空间复杂度为 O(|V|+|E|)

邻接矩阵

无向图 graph 表示

img_07c71cf4dcd5bc8230cb3d15cd0631bb.png
graph_adjacency_matrix

有向图 digraph 表示

img_31e9ae64f8472b72d7b20ca8a9fb3286.png
digraph_adjacency_matrix

若采用邻接矩阵表示,则需要申请空间大小为 |V|^2 的二维数组,在二位数组中保存每两个顶点之间的连通关系,则无论有向图或无向图,邻接矩阵方式的存储空间复杂度皆为 O(|V|^2)。若只记录图中顶点是否连通,不记录权值大小,则可以使用一个二进制位来表示二维数组的每个元素,并且根据无向图的特点可知,无向图的邻接矩阵沿对角线对称,所以可以选择记录一半邻接矩阵的形式来节省空间开销。

两种存储结构对比

根据邻接表和邻接矩阵的结构特性可知,当图为稀疏图、顶点较多,即图结构比较大时,更适宜选择邻接表作为存储结构。当图为稠密图、顶点较少时,或者不需要记录图中边的权值时,使用邻接矩阵作为存储结构较为合适。

代码附录

邻接表结构
# graph node definition
class Node(object):
    def __init__(self, index, weight, next = None):
        self.index = index
        self.weight = weight
        self.next = next

# adjacency list definition
class AdjacencyList(object):
    def __init__(self, number):
        self.number = number
        self.list = [None] * number

    # insert node
    def insert(self, origin, index, weight = 1):
        node = Node(index, weight, self.list[origin - 1])
        self.list[origin - 1] = node

测试代码:

if __name__ == '__main__':
    graph = AdjacencyList(5)
    graph.insert(1, 2)
    graph.insert(1, 3)
    graph.insert(1, 4)
    graph.insert(2, 3)
    graph.insert(3, 1)
    graph.insert(3, 5)
    graph.insert(4, 3)
    for i in range(graph.number):
        print('node', (i + 1), 'links:', end = ' ')
        node = graph.list[i]
        while node:
            print(node.index, end = ' ')
            node = node.next
        print()

输出结果:

node 1 links: 4 3 2 
node 2 links: 3 
node 3 links: 5 1 
node 4 links: 3 
node 5 links: 
邻接矩阵结构
# adjacency list definition
class AdjacencyMatrix(object):
    def __init__(self, number):
        self.number = number
        self.list = [[None] * number for i in range(number)]

    # insert node
    def insert(self, origin, index, weight = 1):
        self.list[origin - 1][index - 1] = weight

测试代码:

if __name__ == '__main__':
    graph = AdjacencyMatrix(5)
    graph.insert(1, 2)
    graph.insert(1, 3)
    graph.insert(1, 4)
    graph.insert(2, 3)
    graph.insert(3, 1)
    graph.insert(3, 5)
    graph.insert(4, 3)
    for i in range(graph.number):
        print('node', (i + 1), 'links:', end = ' ')
        j = 0
        while j < graph.number:
            print(j + 1, end = ' ') if graph.list[i][j] else None
            j += 1
        print()

输出结果:

node 1 links: 2 3 4 
node 2 links: 3 
node 3 links: 1 5 
node 4 links: 3 
node 5 links: 

github 链接:邻接表与邻接矩阵

相关文章
|
2月前
|
存储 算法
描述图的两种数据结构 - 邻接表和邻接矩阵
描述图的两种数据结构 - 邻接表和邻接矩阵
33 0
|
5月前
|
存储 算法
【数据结构】图邻接矩阵的创建完整代码
【数据结构】图邻接矩阵的创建完整代码
127 0
|
6月前
|
存储 算法
描述图的两种数据结构 - 邻接表和邻接矩阵
描述图的两种数据结构 - 邻接表和邻接矩阵
166 0
|
10月前
数据结构186-邻接矩阵表示1
数据结构186-邻接矩阵表示1
38 0
数据结构186-邻接矩阵表示1
|
10月前
数据结构187-邻接矩阵表示1
数据结构187-邻接矩阵表示1
30 0
数据结构187-邻接矩阵表示1
|
存储 机器学习/深度学习 人工智能
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
|
存储 机器学习/深度学习 数据建模
【数据结构】图的存储结构—邻接矩阵
【数据结构】图的存储结构—邻接矩阵
519 0
【数据结构】图的存储结构—邻接矩阵
|
存储
图 无向网 采用邻接矩阵存储结构 按深度优先搜索和广度优先搜索遍历图 (DFS,BFS)实验报告 数据结构
图 无向网 采用邻接矩阵存储结构 按深度优先搜索和广度优先搜索遍历图 (DFS,BFS)实验报告 数据结构
84 0
图 无向网 采用邻接矩阵存储结构 按深度优先搜索和广度优先搜索遍历图 (DFS,BFS)实验报告 数据结构
|
存储 机器学习/深度学习 算法
数据结构之自建算法库——图及其存储结构(邻接矩阵、邻接表)
本文是[数据结构基础系列(7):图]中第4课时[图的邻接矩阵存储结构及算法]和第5课时[图的邻接表存储结构及算法],并为后续内容的实践提供支持。   图的存储结构主要包括邻接矩阵和邻接表,本算法库提供存储结构的定义,以及用于构造图存储结构、不同结构的转换及显示的代码。算法库采用程序的多文件组织形式,包括两个文件:      1.头文件:graph.h,包含定义图数据
1748 0
|
存储 算法
数据结构例程——图的邻接矩阵存储结构及算法
本文是[数据结构基础系列(7):图]中第4课时[图的邻接矩阵存储结构及算法]的例程。 #include &lt;stdio.h&gt; #include &lt;malloc.h&gt; #define MAXV 100 /*最大顶点数设为100*/ #define LIMITLESS 9999 typedef struct { int no;
1211 0
推荐文章
更多