网页版:http://burningcloud.cn/article/121/index.html 亲爱的读者朋友大家晚上好,前两篇文章我们介绍了点集合的直径和连通分量的数量这两个问题,这次我们来分析近似最小支撑树,还是照例,我们先来看一下问题的形式化定义。
已知: G = ( V , E ) , ϵ , d = d e g ( G ) G=(V,E),\epsilon,d = deg(G) G=(V,E),ϵ,d=deg(G),边 ( u , v ) (u,v) (u,v)的权重是 w u v ∈ { 1 , 2 , … , w } ∪ { ∞ } w_{uv}\in \{1,2,\dots,w\}\cup \{\infty\} wuv∈{1,2,…,w}∪{∞}
求: M ^ \hat{M} M^满足 ( 1 − ϵ ) M ≤ M ^ ≤ ( 1 + ϵ ) M (1-\epsilon)M\leq \hat{M} \leq (1+\epsilon)M (1−ϵ)M≤M^≤(1+ϵ)M,令 M M M为 min T s p a n s G { W ( T ) } \min_{T spans G}\{W(T)\} minTspansG{W(T)}
MST问题可以在多项式时间求解,例如 K r u s k a l Kruskal Kruskal算法,但是这里并不要求精确的计算结果,而是求出正确结果的一个近似,并且和正确结果之间的误差不超过 ϵ ⋅ M \epsilon \cdot M ϵ⋅M。
为了介绍一个全新的计算最小生成树的算法,我们需要重新利用分解的方法来定义 M M M,这个很重要,具体的定义以及定理如下所示:
定义:首先我们定义 G G G的子图 G ( i ) = ( V , E ( i ) ) G^{(i)}=(V,E^{(i)}) G(i)=(V,E(i)),这里 E ( i ) = { ( u , v ) ∣ w u v ≤ i } E^{(i)} = \{(u,v)|w_{uv}\leq i\} E(i)={(u,v)∣wuv≤i},在这个子图上的连通分量的个数为 C ( i ) C^{(i)} C(i),于是我们就可以将 M M M表示为所有这样的子图的连通分量的数目的和,具体如下面的公式(定理)。
***定理***: M = n − w + ∑ i = 1 w − 1 C ( i ) M=n-w+\sum_{i=1}^{w-1}{C^{(i)}} M=n−w+∑i=1w−1C(i)
证明:设图 G G G的一个最小生成树为 M S T = ( V , E ′ ) MST=(V,E') MST=(V,E′), M S T MST MST的子图 M S T ( i ) = ( V ′ , E ′ ( i ) ) , V ′ = V , E ′ ( i ) = { ( u , v ) ∣ ( u , v ) ∈ E ( i ) & ( u , v ) ∈ E ′ } MST^{(i)} = (V',E'^{(i)}),V'=V,E'^{(i)}=\{(u,v)|(u,v) \in E^{(i)} \And (u,v) \in E'\} MST(i)=(V′,E′(i)),V′=V,E′(i)={(u,v)∣(u,v)∈E(i)&(u,v)∈E′}。
设 α i \alpha_i αi为 M S T MST MST 中权重为 i i i的边的数目,于是 ∑ i > 1 α i \sum_{i>1}{\alpha_i} ∑i>1αi表示 M S T MST MST中所有边权大于 l l l的边的个数,这个数值加1,应该就是在 M S T MST MST中将这些边从 M S T MST MST中去掉之后得到的 M S T ( l ) MST^{(l)} MST(l)中的连通分量的个数,而 M S T ( l ) MST^{(l)} MST(l)得连通分量的个数应该与 G ( i ) G^{(i)} G(i)是一致的,于是我们得到了下面的式子: ∑ i > 1 α i = C ( l ) − 1 \sum_{i>1}{\alpha_i}=C^{(l)}-1 ∑i>1αi=C(l)−1。
于是我们就可以用如下的方法计算 M M M了: KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ M &= \sum_{i=1… 证毕
有了上面的定理,我们就可以用之前已经分析过的求连通分量的算法来解决这个问题了,算法过程相当简单,就不再赘述了,我们主要来分析一下算法的精确性,时间复杂度。
精确度
在上一篇文章中我们讲过, ∣ C − C ^ ∣ ≤ ϵ ⋅ n 2 |C - \hat{C}|\leq \frac{\epsilon\cdot n}{2} ∣C−C^∣≤2ϵ⋅n,于是我们使用绝对值不等式求 ∣ M − M ^ ∣ = ∣ ∑ i = 1 w − 1 C ( i ) − ∑ i = 1 w − 1 C ( i ) ^ ∣ ≤ ∑ i = 1 w − 1 ∣ C ( i ) − C ( i ) ^ ∣ ≤ ϵ ⋅ w ⋅ n 2 |M-\hat{M}|=|\sum_{i=1}^{w-1}{C^{(i)}}-\sum_{i=1}^{w-1}{\hat{C^{(i)}}}|\leq \sum_{i=1}^{w-1}|{C^{(i)}}-\hat{C^{(i)}}|\leq \frac{\epsilon\cdot w\cdot n}{2} ∣M−M^∣=∣∑i=1w−1C(i)−∑i=1w−1C(i)^∣≤∑i=1w−1∣C(i)−C(i)^∣≤2ϵ⋅w⋅n,其中 n ≤ M n\leq M n≤M,令 ϵ ′ = ϵ ⋅ w 2 \epsilon'=\frac{\epsilon\cdot w}{2} ϵ′=2ϵ⋅w, ϵ \epsilon ϵ是一个无穷小,于是 ϵ ′ \epsilon' ϵ′也是一个无穷小,所以 ∣ M − M ^ ∣ ≤ ϵ ′ M |M-\hat{M}|\leq \epsilon'M ∣M−M^∣≤ϵ′M满足算法要求的结果。
时间复杂度
也就是运行 w w w次求解连通分量个数的时间复杂度, w ⋅ O ( d / ϵ 3 ) = O ( d w 4 / ϵ ′ 3 ) w\cdot O(d/\epsilon^3)=O(dw^4/\epsilon'^3) w⋅O(d/ϵ3)=O(dw4/ϵ′3)。
好了,这个算法到这里就结束了,分析的过程稍微有些复杂,学起来还是需要一定的耐心,下周一分析如何计算图的平均度,那将会是一个更加有趣的问题。