
1. 正则图到底是什么从一个网络设计的故事说起我第一次对“正则图”这个概念产生强烈印象不是因为数学课而是因为一个局域网交换拓扑的设计方案。当时团队要搭一套并行计算测试环境规划里给每个计算节点留的网络端口数完全一样交换机互联关系也想做成“谁跟谁都能快速直达”的对称结构。后来有位师兄说了一句“这就是在找正则图嘛最好是连通性好的那种。”我当时愣了一下——图论里“每个顶点度数都相同”的图居然在工程里这样自然地冒了出来。从那以后我开始认真对待正则图regular graph。所谓正则图就是一张图里所有顶点的度数都相等。如果每个顶点都有 k 条边连出去就称为 k-正则图。简单说这就是一张“所有节点身份对等”的图没有哪个节点更中心也没有哪个节点是边缘角色。这个定义听起来简单但它的能量相当大从数学上的代数图论到网络工程的容错设计再到编码理论里的低密度校验码正则图都是一个绕不开的基础结构。这篇文章我想站在“实际使用和自学踩坑”的角度把正则图是什么、有哪些关键性质、怎么构建、怎么判断、能解决什么问题以及我踩过的那些坑一次讲清楚。适合的人群很广准备算法竞赛或考研的本科生、做复杂网络研究的研究生、写网络拓扑模拟的工程师甚至只是对图论好奇的爱好者认真看完都会有自己的收获。2. 正则图的基础性质那些“一眼看不出细想很关键”的定理2.1 对度数与边数的硬性约束正则图最基础也是最重要的一个约束来自握手定理所有顶点的度数之和等于边数的两倍。对 n 个顶点的 k-正则图来说总度数是 n×k所以边数 m 必须满足m n×k / 2这里蕴含着一个非常容易踩的坑n 和 k 的乘积必须是偶数否则这张图在数学上根本不存在。举个最直观的例子5 个顶点的 3-正则图是不存在的因为 5×315除以 2 得到 7.5边数不可能是小数。很多新手在脑内构图时总想画出“5个点每个点度数为3”的图反复尝试无果后才意识到这是握手定理的硬约束。这个约束在工程上也有意义。我见过有人拿随机图模型生成拓扑参数配了个“奇数乘奇数”的组合结果算法跑半天不收敛最后查资料才发现一开始的约束就错了。所以下次无论是自己写代码构模还是调现成库先算一下 n×k 是否为偶数能省下大量排查时间。2.2 补图、连通分量与正则性的保持正则图有一个非常优雅的性质k-正则图的补图一定是 (n-1-k)-正则图。原因是顶点 v 在原图中有 k 个邻居其余 n-1-k 个顶点在补图中会变成它的邻居。这意味着很多正则图之间存在“互补”关系。比如 7 个顶点的 4-正则图直接通过 C₇7圈的补图就能得到不用费劲重新构图。另一个需要提醒的细节是连通性。正则图不一定是连通图。k0 时是若干孤立点k1 时一定是若干条边K₂的并k2 时每个连通分量是一个圈。k≥3 时情况变得复杂一个 3-正则图可以是连通的也可以由两个 3-正则连通分量并在一起。更重要的是当正则图不连通时每个连通分量仍然是 k-正则的但它们之间不一定同构。这个观察在算法题里很常见判断“是否所有连通分量都是正则图”时必须放松为“每个分量内部度数一致”而不是整体所有顶点度数一致。2.3 邻接矩阵特征值最大特征值必然是 k正则图真正让人着迷的地方从邻接矩阵特征值的角度才真正展开。设 G 是 n 个顶点的 k-正则图A 是它的邻接矩阵。如果取全 1 向量 1那么 A×1 的第 i 个分量恰好是顶点 i 的度数。对 k-正则图来说所有分量都是 k也就是A×1 k×1这直接说明了 k 是邻接矩阵的一个特征值对应的特征向量是全 1 向量。更严格地说对于连通的正则图k 就是最大的特征值对于不连通的正则图k 这个特征值出现的重数恰好等于连通分量的数量。这个结论在判断图的连通性时相当好用只要对邻接矩阵做一次特征值分解数一下最大特征值的重数就知道图被分成了几块。我第一次看到这个结论时觉得很神奇——一个纯离散的图结构居然能用线性代数工具这样干净地刻画。后来做复杂网络分析时我经常用这个性质验证自己构造的正则图是否连通比单纯用 BFS 或 DFS 多一个独立的角度两个结果互相验证更稳妥。2.4 强正则图正则图里的“尖子生”在一般正则图之上还有一类结构更强的图叫强正则图strongly regular graph。它有四个参数 (v, k, λ, μ)其中 v 是顶点数k 是度数λ 是任意两个相邻顶点的公共邻居数μ 是任意两个不相邻顶点的公共邻居数。这个“任意”是关键词——它对每一对顶点都做出严格规定所以强正则图的结构非常紧凑。最经典的例子是佩特森图Petersen graph参数为 (10, 3, 0, 1)。它由 10 个顶点构成每个顶点度数为 3任意相邻顶点没有公共邻居任意不相邻顶点恰好有 1 个公共邻居。强正则图有一个重要约束关系k(k-λ-1) (v-k-1)×μ这个式子可以由“从一个顶点出发经过它的某个邻居数一数能到达哪些不相邻顶点”推出来。以前我硬背这个公式后来发现理解推导才最省力固定一个顶点 u它的 k 个邻居每个都有除 u 外 k-1 个邻居其中 λ 个还是 u 的邻居所以每个邻居引出 k-1-λ 个与 u 不相邻的顶点另一边与 u 不相邻的顶点共有 v-k-1 个每个都与 u 的 k 个邻居中的 μ 个相邻。两边一对照公式自然就出来了。3. 正则图图库大赏从常见图族到判断与构造3.1 那些你天天见却未必意识到的正则图正则图不是一个稀有品种恰恰相反很多常见图都是正则图只是平时没注意。完全图 Kₙ 是 (n-1)-正则图每个顶点与其余所有顶点相连。圈图 Cₙ 是 2-正则图每个顶点只与相邻两个顶点相连。完全二分图 K_{n,n} 是 n-正则图左侧 n 个顶点每个都与右侧 n 个顶点相连。超立方体 Q_d 是 d-正则图它的顶点是 d 位二进制串两个顶点相邻当且仅当它们恰好有一位不同。我建议刚开始学习时把这些例子全部手动画一遍。感受“完全图对称性强”和“圈图结构简单”的区别对后续理解谱性质、生成树数量、游走混合时间都会有帮助。3.2 如何判断一张图是不是正则图判断方法在概念上非常简单遍历所有顶点统计度数检查是否全部相等。但在实际工具中有几个细节容易被忽略。如果用的是 NetworkX直接这样做import networkx as nx def is_regular_graph(G): degrees set(dict(G.degree()).values()) return len(degrees) 1这里有个坑G.degree()返回的是 DegreeView 对象直接对它做set()可能会因为包含元组而得不到预期的结果。所以要先dict(G.degree())再取 values再转 set。还有一个更隐蔽的坑是多重图如果图里有平行边NetworkX 默认的degree()会把多重边按实际边数计数所以两条平行边会让度数加 2。这时候要想想你说的“正则”到底按简单图的标准还是多重图的标准。如果不想写代码手工判断时也有一个技巧先挑一个度数最小的顶点算基础度数再看有没有超过它的顶点一旦出现度数不同的顶点就立刻下结论。这比把所有顶点的度数都列出来快很多。3.3 随机正则图生成一个可复现的构造思路实际项目里经常需要“造一张正则图”来做模拟实验。最省力的方式是使用随机正则图生成算法。NetworkX 提供了现成接口G nx.random_regular_graph(k, n, seed42)但底层逻辑值得了解一下因为它有几个边界条件。最简单的构造思路是“配对法”把每个顶点复制 k 份“端口”得到 n×k 个端口然后随机打乱并两两配对每对端口之间连一条边。如果配对过程中出现自环同一顶点的两个端口配在一起或重边两个顶点之间出现多对端口就重新洗牌再来一次。这就是所谓的“配置模型”它保证生成图是 k-正则的但不会直接保证连通性——生成的图有可能分成多块。我实际测试下来用random_regular_graph(3, 30)生成的图大概率是连通的但如果你生成的是 2-正则图很可能得到两个圈而不是一个大圈。所以在做拓扑实验时生成完一定要检查连通性if nx.is_connected(G): print(connected) else: print(disconnected)关于种子参数我建议固定 seed这样实验可以复现。别小看这一点很多学术实验就是因为随机种子没固定结果无法复现导致被审稿人质疑。4. 正则图在真实场景里解决什么问题4.1 网络拓扑与负载均衡回到开头那个并行计算集群的例子。当所有计算节点需要执行相同粒度的任务时我们不希望某些节点承担更多通信任务。正则图天然地保证了每个节点的端口数量一致所以通信负载在端口层面上是均匀的。超立方体拓扑就是典型Q_d 中每个节点有 d 个端口且节点之间高度对称很多科学计算集群的互联拓扑都受这类结构启发。在容错性方面k-正则图的连通度通常更有保障。直观来说因为每个节点都有相同数量的邻居不存在“切断某个枢纽节点导致整个网络瘫痪”的弱点。当然正则度相同的图连通度也分好坏所以工程上还会关注“扩展性”指标这时谱隙最大特征值与第二大特征值之差就派上用场了。谱隙越大图在随机游走意义下扩张得越好网络越不容易出现瓶颈。这个领域里有一类著名图叫拉马努金图就是谱隙接近理论最优的正则图。4.2 编码理论与 LDPC 码正则图在编码理论里有一个非常实际的应用低密度校验码LDPC 码。LDPC 码可以用二分图表示一类节点是变量节点另一类是校验节点。如果每个变量节点的度数都一样每个校验节点的度数也一样这种码就是“正则 LDPC 码”。正则性让码的密度和结构非常均匀分析和硬件实现都更简单。我记得读博士的师兄做 FPGA 上的 LDPC 译码器他纠结的点就是如何构造一个周期长、围长大的正则二分图。“围长”是指图中最短圈的长度正则 LDPC 码的性能跟围长密切相关如果存在长度为 4 的短圈迭代译码的两个变量节点会因为相互冗余而降低性能。所以构造时一般在保证正则性的前提下尽量避开短圈这又回到了正则图结构设计的老本行。4.3 随机游走与量子行走的均匀混合随机游走在正则图上有一个令人愉快的性质平稳分布是均匀分布。因为转移矩阵 P A/k 是双随机矩阵行和为 1列和也为 1这种“各态历经”的均匀性在很多算法里很好用。做马尔可夫链蒙特卡洛采样时如果采样空间本身能组织成正则图那么采样器在长跑后访问各个顶点的概率是均衡的不会因为图本身的结构偏差产生系统误差。量子行走则是另一个前沿方向。连续时间量子行走在超立方体这类高对称正则图上具有很快的传播速度很多量子搜索算法的模拟都构建在正则图上。我虽然只做过很浅的数值实验但能明显感觉到图的对称性越强正则度越高且自同构群越大量子行走的路径干涉越干净数值结果越漂亮。4.4 代数结构与社会网络建模对数学家来说正则图是群论与几何的天然桥梁。凯莱图Cayley graph就是一类典型的正则图给定一个群和一个生成集每个群元素作为一个顶点如果两个顶点相差一个生成元就相连。因为群本身的对称性凯莱图一定是正则图。很多组合结构都脱胎于凯莱图比如我之前提到的佩特森图就是某个群的凯莱图。社会网络研究中虽然真实社交网络远非正则少数大V的度数极高但“准正则”现象很常见当你删掉那些极少数高连接节点后剩余大部分节点的度数分布会集中在一个很窄的区间。我们有时会用“正则化预处理”把网络调整成近似正则图再做社区检测这样算法在首轮迭代时不会因为度数不均导致偏差。这算是工程实践中的一种“正则图思维”。5. 实操中常踩的坑与排查心得5.1 奇偶性陷阱为什么你的图永远画不出来上一节提到过n×k 必须为偶数。这个条件看起来简单实际中却很容易踩。我见过有人想构造 5 个顶点的 3-正则图画了半小时没画出来也见过学生写程序生成随机正则图参数设成random_regular_graph(5, 7)结果程序卡死。5 和 7 都是奇数乘积 35 是奇数这类图根本不存在算法的洗牌重试会反复撞墙运气不好就直接死循环。排查时先做一个快速判断如果 n×k 是奇数直接放弃。如果 k0 或 k≥n也要小心k0 是全部孤立点kn-1 是唯一完全图k≥n 在简单图中不可能。如果 k 是奇数那么 n 必须是偶数。因为 n×k 为偶数而 k 为奇数只能靠 n 为偶数来凑。把这些约束在前置检查里写清楚能避免大量无效计算。5.2 “看起来正则”其实不是隐式条件与误判有些图看起来对称性很强但不是严格的正则图。我犯过最典型的错误是把“二分图两侧度数对称”误认为“整体正则”。比如一个二分图左侧 3 个顶点度数为 4右侧 4 个顶点度数为 3虽然每一侧内部一致但整体并不是正则图。这个区别在代码里往往一瞬间暴露出来但如果不做检查后面所有基于“正则性”的假设就全部失效。还有一个常见误判发生在多重图上。如果两个顶点之间允许有多条边那么判断“度数相同”时一条边被计两次会让顶点度数虚高而有些人定义正则图时只考虑简单图不看多重边两者标准不统一会导致统计口径不一致。我建议在项目开始前就明确记录“这里的正则图是否允许重边”避免代码在后续处理中给出错误结果。5.3 用 NetworkX 生成正则图时的参数限制nx.random_regular_graph(k, n, seed)虽然很方便但它存在一些数学上无解的参数。如果 n3, k2 是合法的其实就是 C₃但 n3, k1 就不合法。NetworkX 内部会有一些检查但并不是所有非法参数都会明确报错有些会一直重试直到资源耗尽。我推荐先自己写好约束检查再调库而不是盲目相信库函数不会出问题。另外一个容易忽略的点是生成图的连通性。random_regular_graph不保证结果连通。如果你需要连通图生成之后跑一次nx.is_connected()检查不满足就换种子重新生成。我在实验里经常用一批不同种子生成多个候选图再挑连通且围长较大的那个用。5.4 正则图同构判定指数爆炸的现实最后想给新手提个醒即使两张正则图有相同的顶点数和度数判断它们是否同构也是困难问题。在小规模时比如 10 个顶点的 3-正则图你可以肉眼观察或借助networkx.is_isomorphic判断随着顶点数增加到几十甚至上百同构判定会变得非常慢因为候选映射数量爆炸式增长。我在跑一些对比实验时遇到过两个图各自看起来都“很正则”但同构检测跑了几小时都没出来。针对这种情况实践中可以先比较一些“不变量”快速排除度数序列虽然正则图都一样、直径、围长、特征值谱。如果这些不变量不同肯定不同构如果完全相同再考虑跑完整的同构算法。这个策略听着朴素在实际项目中能过滤掉绝大多数对比对省的时间非常可观。6. 学习路线与最后一句话6.1 从正则图出发可以延伸的方向如果你刚接触正则图我建议的学习路径是先把定义、握手定理约束、补图性质、邻接矩阵特征值这四件事彻底吃透因为它们是正则图所有高级应用的地基。接着研究强正则图和佩特森图体会“高度对称”和“强正则条件”之间的张力。然后了解凯莱图把正则图放到群论的框架里理解。如果对算法实验感兴趣上手 NetworkX 跑一跑random_regular_graph、complete_bipartite_graph、hypercube_graph等常用结构把特征值、谱隙、连通性这些指标打出来对比很快就能形成直觉。如果还想更深入可以进入代数图论领域学习谱图理论、图的展开性、拉马努金图以及正则图与纠错码、量子计算的交叉方向。这些内容在入门时不用急着吃透但心里要有张地图知道每个概念处在哪个位置。6.2 我的一点学习心得回头看我自己的经验正则图的价值在于它是一个“结构规整”的理想模型。现实世界里的网络很少完全正则但正因为有了正则图这个标准参照物我们才能把“偏离正则”的程度量化出来才谈得上分析异质性才谈得上设计近似结构。每次用图论工具构造实验网络我的第一反应仍然是先问一句能不能用正则图来做如果你正在为一道图论题卡住或者写代码时发现图的结构总是不对称不妨先停下来想一想是否能引入正则性约束。很多时候把图的顶点摆到“完全对等”的位置反而让问题变得异常简单。这个思维习惯比记住任何一条具体的定理都重要。