python 数据结构之图的储存方式

参考链接:https://blog.csdn.net/u014281392/article/details/79120406

所描述的图的结构为:

下面介绍不同的储存方式,我想不必详细分别是每个名称都是那种数据来存储的,或是一种,或是两种的组合,这不是再通用的规定约束而来的结果,只是列举了一些灵活的组合而已。

1.邻接集合

邻接集合就是把顶点的邻接点放在一个集合中

# 将节点的编号赋值给相应的节点,方便操作
a, b, c, d, e, f, g, h = range(8)
N = [{'b', 'c', 'd', 'e', 'f'},
     {'c', 'e'},
     {'d'},
     {'e'},
     {'f'},
     {'c', 'g', 'h'},
     {'f', 'h'},
     {'f', 'g'}]
列表中每个集合是每个节点邻接点集
在python2.7中,set([1,3])这样表示,set()表示空集合.
在python3之后的版中,set{1,3}表示集合,空集合仍用set()表示.

  

#查看a的邻接节点有哪些
N[a]

{'b', 'c', 'd', 'e', 'f'}

# 检查g是否为a的一个邻接节点
'g' in N[a]

False

# 节点a的度
len(N[a])

5

  

2.邻接列表

数据结构和邻接集合差不多,唯一的不同是用列表来储存

# 表示同一个图
a, b, c, d, e, f, g, h = range(8)
N = [ ['b', 'c', 'd', 'e', 'f'],
      ['c', 'e'],
      ['d'],
      ['e'],
      ['f'],
      ['c', 'g', 'h'],
      ['f', 'h'],
      ['f', 'g'] ]
# 邻接列表表示图结构,与邻接集合的操作相同

  

3.邻接字典

临界字典与前面两个的不同之处在于,其不仅采用字典来储存,字典是键值对,键值对中的value用来表示边的权值这一信息,能表示出与邻居节点之间的关联性

a, b, c, d, e, f, g, h = range(8)
N = [{'b':2, 'c':1, 'd':3, 'e':9, 'f':4},
     {'c':4, 'e':3},
     {'d':8},
     {'e':7},
     {'f':5},
     {'c':2, 'g':2, 'h':2},
     {'f':1, 'h':6},
     {'f':9, 'g':8}]

#操作
'e' in N[a]
True

 边的权值
N[a]['c']

1

  

4.嵌套字典

不用添加序号了 

# 以上三种图的表示,都是使用了list类型
# 下面使用嵌套的字典结构
N = {'a':{'b':2, 'c':1, 'd':3, 'e':9, 'f':4},
     'b':{'c':4, 'e':3},
     'c':{'d':8},
     'd':{'e':7},
     'e':{'f':5},
     'f':{'c':2, 'g':2, 'h':2},
     'g':{'f':1, 'h':6},
     'h':{'f':9, 'g':8}}

  其他的操作和别的结构相同

# a,e之间链接权值
N['a']['e']

  

4.邻接矩阵

# 邻接矩阵,通过一个二维数组,对应图中的每个节点,使用0,1来表示相关节点是否为当前节点的邻居
# 可以使用嵌套list实现
a, b, c, d, e, f, g, h = range(8)

N = [[0, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 1, 1, 0]]

  

# 检查a, b是否为相邻节点,即检查N[a][b]是否为1
N[a][b] == 1

True

  

# c节点的度 sum(N[c])

扩展邻接矩阵,实现一个没有自循环,对边加权 、无自循环状态,对角线元素全部为0 、加权,用权值替换真值 、将不存在的边设置一个去穷大的权值(float('inf')),或None

a, b, c, d, e, f, g, h = range(8)
inf = float('inf')

N = [[  0,   2,   1,   3,   9,   4, inf, inf],
     [inf,   0,   4, inf,   3, inf, inf, inf],
     [inf, inf,   0,   8, inf, inf, inf, inf],
     [inf, inf, inf,   0,   7, inf, inf, inf],
     [inf, inf, inf, inf,   0,   5, inf, inf],
     [inf, inf,   2, inf, inf,   0,   2,   2],
     [inf, inf, inf, inf, inf,   1,   0,   6],
     [inf, inf, inf, inf, inf,   9,   8,   0]]

  

# 检查a,b是否互为相邻节点,只要邻接权值不是无穷大
N[a][b] < inf

  

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种流行的编程语言,它包含了丰富的数据结构和算法实例,可以用来解决各种问题。下面举几个例子来说明。 1. 列表(List)是Python中常用的数据结构之一,可以存储多个元素,并且可以根据索引进行访问和修改。例如,可以使用列表来保存一组数字,然后对它们进行排序、查找最大值等操作。 2. 字典(Dictionary)是另一种常用的数据结构,它可以存储键值对。可以使用字典实现一些常见的映射关系,例如用英语单词作为键,对应的中文翻译作为值,可以通过键来快速查找对应的值。 3. 链表(Linked List)是一种基础的数据结构,可以用来实现队列、栈等高级数据结构。可以使用Python来创建链表,并进行插入、删除等操作。 4. 排序算法是算法中常见的问题之一。Python提供了许多排序算法的实现,例如冒泡排序、插入排序、快速排序等。可以根据具体的需求选择合适的算法。 5. 算法是解决一些复杂问题的强大工具。Python提供了的表示和操作的库,可以用来解决相关的算法问题,例如最短路径、最小生成树等。 上述只是其中的一小部分示例,Python还提供了许多其他数据结构和算法的实现。但无论是使用哪种数据结构或算法,都需要根据具体的问题选取合适的实现,并且了解其时间复杂度和空间复杂度,以便在实际应用中达到高效的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值