数学 旧 .com 迁移

图论与组合:讨论班 / 复杂度分析

从旧 .com 全量搬运的历史内容,来源路径:/math/课程/图论与组合/chapters/讨论班/复杂度分析/

迁移来源

复杂度分析

参数与符号 #

设图 G=(V,E)G=(V,E) 中顶点数 V=n|V|=n、边数 E=m|E|=m,顶点 11 的度为 d1:=degG(1)=E1d_1:=\deg_G(1)=|E_1|E1E_1 为与 11 相邻的边集,E0:=EE1E_0:=E\setminus E_1)。 在 V{1}V\setminus\{1\} 上用 E0E_0 的 Kruskal(升序)得到最小生成森林 F0minF_0^{\min},其连通块数为 rr。 记 α()\alpha(\cdot) 为反阿克曼函数,DSU(并查集)近似视为常数摊还。

基树阶段的代价 #

  • 排序与 Kruskal:E0E_0 排序并运行 Kruskal,时间 O(E0logE0+E0α(n))O(mlogm)O(|E_0|\log |E_0| + |E_0|\alpha(n)) \subseteq O(m\log m)
  • 块内最小 11-边: 在 Kruskal 过程中/结束后,线性扫描 E1E_1 为每个块 CC 维护 bmin(C)b_{\min}(C),时间 O(d1)O(m)O(d_1)\le O(m)
  • 构造基树: 合并 F0minF_0^{\min}{bmin(Ci)}i=1r\{b_{\min}(C_i)\}_{i=1}^r,线性时间。

综上,基树阶段时间 O(mlogm)O(m\log m),空间 O(n+m)O(n+m)

“指派”与候选排序的代价 #

在 Kruskal 合并两个块 A,BA,B 的时刻,维护每块的 m()=m(\cdot)= “块内最小 11-边权”,并将该次合并边 e0e_0 指派给 max{m(A),m(B)}\max\{m(A),m(B)\} 对应的 11-边,得到映射 kill()\mathrm{kill}(\cdot)

  • 维护 m()m(\cdot) DSU 合并时用“按秩合并+路径压缩”并携带块信息,摊还 O(1)O(1)
  • 指派记录: 每次合并常数时间追加一条记录,总代价 O(E0)O(|E_0|)
  • 候选分类与排序: 将剩余候选 11-边划分为 E1={e:w(e)<w(kill(e))}\mathcal{E}_1=\{e: w(e)<w(\mathrm{kill}(e))\}(一类边)与 E2\mathcal{E}_2(二类边),并分别按 w(kill(e))w(\mathrm{kill}(e)) 降序与 w(e)w(e) 升序排序。 时间 O(E1logE1+E2logE2)O(d1logd1)O(mlogm)O(|\mathcal{E}_1|\log |\mathcal{E}_1| + |\mathcal{E}_2|\log |\mathcal{E}_2|)\subseteq O(d_1\log d_1)\subseteq O(m\log m)

增添阶段的代价 #

增添阶段最多执行 krd1k-r\le d_1 次“加入一条 11-边并删一条环上最大边”的操作。

  • 挑选下一条边: 由于 E1,E2\mathcal{E}_1,\mathcal{E}_2 事先排好序,顺序扫描即可,摊还 O(1)O(1)
  • 删除的环上最大边: 采用离线“指派”后,kill(e)\mathrm{kill}(e) 指示将被删除的那条非 11-边(或其等价的路径最大边),可在 O(1)O(1) 时间完成替换与集合更新。

因此增添阶段总时间 O(kr)O(d1)O(m)O(k-r)\le O(d_1)\le O(m)

总时间与空间复杂度 #

综合上述各阶段:

T(m,n)=O(mlogm)S(m,n)=O(n+m). T(m,n)=O(m\log m)\quad\text{且}\quad S(m,n)=O(n+m).

时间的主导来自一次全局排序与 Kruskal;其余操作为线性或近线性。

可选的在线维护方案(替代“指派”) #

在某些应用中,需要动态从一棵受度或直径限制的生成树重构到另一棵,此类重新配置问题在建模与复杂度上存在额外挑战 \cite{bousquet2022reconfiguration}。

若不使用离线“指派”,可用 Link-Cut Tree(LCT)/树剖 + 线段树维护当前树上路径最大边, 则每次“加入一条 11-边并删除环上最大边”在 O(logn)O(\log n) 时间完成; 增添阶段复杂度变为 O((kr)logn)O((k-r)\log n),总复杂度

O(mlogm+(kr)logn)O(mlogm+mlogn). O(m\log m + (k-r)\log n)\subseteq O(m\log m + m\log n).

在实际实现中,离线“指派”更简洁,常数因子更小。

与朴素/改进基线的比较 #

  • 朴素枚举(仅作小规模): 穷举 (d1k)\binom{d_1}{k}11-边选择,每次做一遍 MST 检查,复杂度爆炸,仅在 n10n\le 10 可行。
  • 基于二分“最小瓶颈”的检查: 对最大边权做二分,每次用并查集验证可行性, 复杂度 O(mlogm+(logm)(mα(n)))=O~(mlogm)O\big(m\log m + (\log m)\cdot (m\alpha(n))\big)=\tilde O(m\log m),但常数较大, 且需要额外的可行性与度数达成性判断逻辑。
  • 本文算法: 单次排序 + Kruskal + 离线“指派”,总体 O(mlogm)O(m\log m), 常数小、实现简洁,并且直接输出词典序最小解而非仅判定可行。

关于下界与可改进空间 #

在基于比较的模型下,对任意实权边集进行完全排序需要 Ω(mlogm)\Omega(m\log m) 次比较; Kruskal 亦以排序为主要瓶颈,因而 O(mlogm)O(m\log m) 是自然的上界。 若权值可做线性时间桶化/基数排序(例如整数小范围权),则整体可达 O(m+n)O(m+n) 级别; 若采用更高阶的 MST 线性/次线性算法(例如随机化 Karger–Klein–Tarjan 框架), 本问题亦可在相近的复杂度范围内实现,不过实现复杂度显著提高,且需要将单点度约束与词典序判定谨慎嵌入该框架。

讨论

评论

正在加载评论...