交互式图论学习
交互式图论学习
Guest User
Using app without sign in
极大团查找器
找到最大的完全子图(所有顶点相连)
选择算法并生成步骤以开始可视化
团是两两相连的顶点集合。极大团无法通过再加入一个顶点来扩展,而找出所有极大团或单个最大团,是网络分析中一个基础的 NP 难问题。
Bron-Kerbosch 算法通过在三个集合上递归回溯来枚举所有极大团:当前团 R、与 R 全体相连的候选集 P,以及已覆盖的排除集 X。选取好的枢轴能大幅剪枝递归,按退化序处理顶点则给出已知最佳枚举界 O(3 的 n/3 次方),与极大团可能的最大数目相匹配。
团检测可在社交网络中发现紧密社区、在生物学中发现蛋白质相互作用复合体、在金融中发现相关资产,并在推荐系统中发现共同购买的商品组。团问题也是讲授 NP 完全性归约的标准工具。
Bron-Kerbosch 用三个集合来搜索:R 是目前已构建的团,P 是仍有可能扩充它的候选结点,X 是本层已经尝试过的结点。当且仅当 P 与 X 同时为空时,R 才是一个极大团。
BronKerbosch(R, P, X):
若 P 与 X 都为空:
把 R 报告为一个极大团
返回
对 P 中的每个结点 v:
BronKerbosch(R + {v},
P 交 邻居(v),
X 交 邻居(v))
P = P - {v}
X = X + {v}
// 带枢轴:从 P 并 X 中选一个枢轴 u,
// 只对 P 中「不是 u 的邻居」的那些 v 进行分支X 正是人们最容易省掉的部分,而少了它,算法就会把并非极大的团也报告出来。某个结点一旦在本层被探索过,就会移入 X,于是任何本可以包含它的团都会因不极大而被否决。随后的枢轴优化则大幅削减分支因子:每个极大团都必然包含枢轴或它的某个非邻居,因此对其余结点分支纯属浪费。
枚举一个含六条边的图的全部极大团,该图由两个相互重叠的三角形和一条悬挂边构成。
示例图: 无向边 A-B、A-C、B-C、B-D、C-D 和 D-E。
极大团为 {A, B, C}、{B, C, D} 和 {D, E}。最大团(即规模最大的那种)大小为 3,而且有两个。请注意「极大」与「最大」并不相同:{D, E} 是极大团,因为没有任何结点能扩充它,但它离最大差得很远。另外也请注意 B 与 C 各自出现在两个极大团中,这很正常,也解释了为何极大团的数量可能远超结点数。
时间: O(3^(V/3)) · 空间: O(V^2)
这个界来自 Moon-Moser 定理:含 V 个结点的图至多有 3 的 V/3 次方个极大团,而且这个界是紧的,由 V/3 个三角形构成的完全多部图即可达到。既然算法至少要把每个极大团都输出一遍,任何枚举算法在最坏情况下都不可能更快,而带枢轴的 Bron-Kerbosch 恰好达到了这个界。这一点值得内化:算法本身是最优的,但问题本身就是指数级的。仅仅找出最大的那个团就已是 NP 困难,甚至把它近似到任何合理的因子之内也很困难。在实践中,枢轴加上退化度排序能让数万结点规模的真实稀疏图变得可处理,因为稀疏图的极大团数量远少于最坏情况。
先想清楚你要的是全部极大团还是仅仅最大的那一个,因为这是两个不同的问题,用的工具也不同。
| 替代算法 | 以下情况更合适 | 代价 |
|---|---|---|
| 带枢轴的 Bron-Kerbosch | 你要全部极大团。标准做法,而且在最坏情况下最优。 | O(3^(V/3)) |
| 退化度排序变体 | 真实的稀疏图。按退化度 d 排序能给出好得多的实际界。 | O(d·V·3^(d/3)) |
| 最大团的分支定界 | 你只要那唯一一个最大团,不需要完整枚举。着色上界能剪掉很多分支。 | 指数级,但实践中快得多 |
| 补图加独立集 | 你的问题其实关乎两两不相邻的结点。G 中的团就是 G 的补图中的独立集。 | 等价 |
| 三角形枚举 | 你只关心规模为 3 的团,那是容易得多的特例。 | O(E^1.5) |