news 2026/5/8 13:04:38

别再死记硬背了!用Python NetworkX库5分钟搞懂图论里的‘度’、‘邻居’和‘握手定理’

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再死记硬背了!用Python NetworkX库5分钟搞懂图论里的‘度’、‘邻居’和‘握手定理’

用Python NetworkX实战图论:从代码中理解‘度’、‘邻居’与‘握手定理’

在计算机科学和离散数学的交叉领域,图论一直扮演着重要角色。但对于初学者来说,那些抽象的定义和定理常常让人望而生畏。今天,我们将打破传统学习方式,用Python的NetworkX库和几行代码,让这些概念变得触手可及。不需要死记硬背,通过动手实践,你会发现图论的核心概念其实非常直观。

1. 环境准备与基础概念可视化

在开始之前,确保你的Python环境已经安装了NetworkX和Matplotlib库。如果没有,可以通过以下命令安装:

pip install networkx matplotlib

NetworkX是Python中处理复杂网络的顶级工具库,而Matplotlib则帮助我们实现图形可视化。我们先从最简单的图开始——创建一个包含5个顶点的无向图:

import networkx as nx import matplotlib.pyplot as plt G = nx.Graph() G.add_edges_from([(1,2), (1,3), (2,3), (3,4), (4,5)]) nx.draw(G, with_labels=True, node_color='lightblue') plt.show()

运行这段代码,你会看到一个简单的图形展示在屏幕上。现在,让我们用代码来探索图论中的基本术语:

  • 顶点的度(degree): 与该顶点相连的边的数量
  • 邻居(neighbor): 与某顶点直接相连的其他顶点集合
  • 孤立点(isolated vertex): 度为0的顶点
  • 悬挂点(pendant vertex): 度为1的顶点

在NetworkX中,获取这些信息非常简单:

print("顶点3的度:", G.degree[3]) print("顶点3的邻居:", list(G.neighbors(3))) print("图中所有顶点的度:", dict(G.degree()))

2. 特殊图类型的生成与分析

图论中有几种特殊类型的图经常被研究和应用。让我们用代码生成它们并观察其特征。

2.1 完全图(Kn)

完全图是指每对不同顶点之间都恰有一条边的简单图。在NetworkX中创建完全图非常简单:

K5 = nx.complete_graph(5) nx.draw(K5, with_labels=True, node_color='lightgreen') plt.show()

完全图Kn的边数计算公式为n(n-1)/2。我们可以验证这一点:

print("K5的边数:", K5.number_of_edges()) # 输出10,因为5*4/2=10

2.2 圈图(Cn)

圈图是由n个顶点组成的环形图,每个顶点恰好与两个其他顶点相连。

C6 = nx.cycle_graph(6) nx.draw(C6, with_labels=True, node_color='pink') plt.show()

圈图Cn的边数等于顶点数n。我们可以验证:

print("C6的边数:", C6.number_of_edges()) # 输出6

2.3 二分图与完全二分图

二分图是指顶点可以划分为两个不相交集合,使得每条边都连接两个集合中的顶点。完全二分图Km,n则是两个集合之间所有可能的边都存在。

K3_2 = nx.complete_bipartite_graph(3, 2) nx.draw(K3_2, with_labels=True, node_color='yellow') plt.show()

判断一个图是否是二分图,可以使用NetworkX的二分检查函数:

print("K3_2是二分图吗?", nx.is_bipartite(K3_2)) # 输出True print("K5是二分图吗?", nx.is_bipartite(K5)) # 输出False

3. 握手定理的编程验证

握手定理是图论中的一个基本定理,它指出:在任何无向图中,所有顶点的度数之和等于图中边数的两倍。让我们用代码来验证这个定理。

首先,我们创建一个随机图:

import random random_graph = nx.Graph() nodes = range(1, 11) random_graph.add_nodes_from(nodes) # 随机添加一些边 for i in nodes: for j in range(i+1, 11): if random.random() < 0.3: random_graph.add_edge(i, j) nx.draw(random_graph, with_labels=True, node_color='orange') plt.show()

现在验证握手定理:

sum_of_degrees = sum(dict(random_graph.degree()).values()) edge_count = random_graph.number_of_edges() print("所有顶点度数和:", sum_of_degrees) print("边数的两倍:", 2 * edge_count) print("握手定理成立吗?", sum_of_degrees == 2 * edge_count)

握手定理的一个重要推论是:任何图中度为奇数的顶点必有偶数个。我们可以验证这一点:

odd_degree_nodes = [v for v, d in random_graph.degree() if d % 2 != 0] print("度为奇数的顶点数量:", len(odd_degree_nodes))

4. 有向图的度概念扩展

在有向图中,度的概念被细化为入度和出度。入度是指向该顶点的边数,出度是从该顶点出发的边数。

让我们创建一个有向图并分析其度分布:

DG = nx.DiGraph() DG.add_edges_from([(1,2), (2,3), (3,1), (1,4), (4,5), (5,1)]) nx.draw(DG, with_labels=True, node_color='lightblue', arrows=True) plt.show() print("顶点1的入度:", DG.in_degree(1)) print("顶点1的出度:", DG.out_degree(1)) print("所有顶点的入度:", dict(DG.in_degree())) print("所有顶点的出度:", dict(DG.out_degree()))

在有向图中,所有顶点的入度之和等于所有顶点的出度之和,且都等于图中的边数。我们可以验证:

total_in_degree = sum(dict(DG.in_degree()).values()) total_out_degree = sum(dict(DG.out_degree()).values()) edge_count = DG.number_of_edges() print("入度和:", total_in_degree) print("出度和:", total_out_degree) print("边数:", edge_count) print("定理成立吗?", total_in_degree == total_out_degree == edge_count)

5. 实际应用与性能考量

理解了这些基础概念后,我们可以将它们应用到实际问题中。例如,社交网络分析中,顶点的度可以表示一个人的连接数量;在网页排名算法中,有向图的入度和出度具有重要意义。

对于大型图,NetworkX提供了一些优化方法:

# 对于大型图,使用稀疏表示 large_graph = nx.Graph() large_graph.add_edges_from([(i, i+1) for i in range(10000)]) # 计算度的分布 degree_sequence = sorted([d for n, d in large_graph.degree()], reverse=True) print("最大度:", max(degree_sequence)) print("最小度:", min(degree_sequence))

在实际项目中,当处理超大规模图时,可能需要考虑更高效的图计算框架如GraphX或DGL,但NetworkX对于中小型图和学习目的来说已经足够强大。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 13:04:38

语音修复终极指南:如何用VoiceFixer一键拯救受损音频

语音修复终极指南&#xff1a;如何用VoiceFixer一键拯救受损音频 【免费下载链接】voicefixer General Speech Restoration 项目地址: https://gitcode.com/gh_mirrors/vo/voicefixer 你是否曾为嘈杂的录音、失真的语音或历史音频的模糊不清而烦恼&#xff1f;VoiceFixe…

作者头像 李华
网站建设 2026/5/8 13:03:55

MelonLoader完整指南:5步轻松安装Unity游戏模组加载器

MelonLoader完整指南&#xff1a;5步轻松安装Unity游戏模组加载器 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 想在Unity游戏…

作者头像 李华
网站建设 2026/5/8 13:02:05

PX4飞控用TFmini激光雷达测高,为啥高度会乱跳?我的户外实测与终极解决(附参数配置)

PX4飞控搭配TFmini激光雷达的测高稳定性优化实战 户外低空飞行时&#xff0c;无人机高度数据的稳定性直接关系到飞行安全与任务执行效果。许多开发者在使用PX4飞控配合TFmini激光雷达进行测高时&#xff0c;都遇到过高度数据异常跳变的问题——明明雷达本身的测距数据稳定&…

作者头像 李华
网站建设 2026/5/8 12:47:44

别再死记硬背了!用Cisco Packet Tracer模拟器5分钟搞定VLAN间通信实验

5分钟玩转VLAN间通信&#xff1a;用Cisco Packet Tracer告别枯燥命令记忆 刚接触网络工程的新手们&#xff0c;是否曾被VLAN间通信的配置步骤折磨得头晕眼花&#xff1f;那些看似毫无规律的CLI命令、容易遗漏的no shutdown操作、令人困惑的trunk模式设置&#xff0c;往往让初学…

作者头像 李华
网站建设 2026/5/8 12:47:42

3步快速找回压缩包密码:ArchivePasswordTestTool终极使用指南

3步快速找回压缩包密码&#xff1a;ArchivePasswordTestTool终极使用指南 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 你是否曾因忘记ZI…

作者头像 李华