继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

慕村9548890
关注TA
已关注
手记 1249
粉丝 227
获赞 989

webp

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


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


webp

graph

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


webp

digraph

邻接表

无向图 graph 表示

webp

graph_adjacency_list

有向图 digraph 表示

webp

digraph_adjacency_list

存储的总顶点个数为 (暂不考虑自回路)。因为需要申请大小为 组来保存节点,对节点分配序号,所以需要申请大小为  的额外存储空间,即邻接表方式的存储空间复杂度为 。

邻接矩阵

无向图 graph 表示

webp

graph_adjacency_matrix

有向图 digraph 表示

webp

digraph_adjacency_matrix

录权值大小,则可以使用一个二进制位来表示二维数组的每个元素,并且根据无向图的特点可知,无向图的邻接矩阵沿对角线对称,所以可以选择记录一半邻接矩阵的形式来节省空间开销。

两种存储结构对比

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

代码附录

邻接表结构
# graph node definitionclass Node(object):
    def __init__(self, index, weight, next = None):        self.index = index        self.weight = weight        self.next = next# adjacency list definitionclass 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 definitionclass 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:



作者:zhipingChen
链接:https://www.jianshu.com/p/ce4109962031


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP