专栏文章
线性求最小生成树算法学习笔记
算法·理论参与者 3已保存评论 3
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @miof2pbj
- 此快照首次捕获于
- 2025/12/02 18:10 3 个月前
- 此快照最后确认于
- 2025/12/02 18:10 3 个月前
前言
神秘的算法,又是 Tarjan 的作品。
介绍
注意 KKT(Karger-Klein-Tarjan)算法不是 KKT(Karush-Kuhn-Tucker)条件。
该算法基于 Boruvka 算法,Boruvka 算法的时间复杂度是 ,而 KKT 算法的期望时间复杂度为 ,最坏时间复杂度为 。
Boruvka 算法
要学会 KKT,我们要先学会 Boruvka 算法,而 Boruvka 算法是由 Boruvka step 组成的。每个 Boruvka step 的时间复杂度是 ,它可以求出一个带权连通图的最小生成森林。
最小生成森林
一个带权连通图的最小生成森林是该图的一个子图(包含原图中所有点,但不一定包含所有边),可以不连通,当然还有一些其他性质。但在这个算法里,最小生成森林的用处就在于:一个带权连通图的最小生成森林也是该图的最小生成树的一个子图。
然后我们还有另一个贪心的性质:对于一个结点,连接它的边中权值最小的边一定在最小生成树上(所以也可以在最小生成森林上)。
所以我们就知道怎么进行 Boruvka step 了:
对每个结点,找到连接它的边中权值最小的边,然后把它加入一个边集里。根据上面的性质,把不在这个边集里的边去掉,得到的图就是原图的一个最小生成森林。
例如(加粗的边是一次 Boruvka step 之后会选出的边):

然后我们可以来看 Boruvka 算法,它的步骤如下(假设原图为 ):
- 对 进行一次 Boruvka step;
- 得到的图中可能会有很多连通块,我们把每个联通块缩成一个点,并保留每个连通块间的边,这会得到一个新图 ;
- 如果 中只有一个结点,那么 Boruvka 算法结束,否则回到步骤 1 对 进行同样的事情。
然后我们可以来进行一下复杂度分析:
- 显然一次 Boruvka step 的时间复杂度是 ;
- Boruvka 算法的时间复杂度取决于执行 Boruvka step 的次数,所以它的复杂度为 , 是执行 Boruvka step 的次数;
- 又每次执行 Boruvka step 后节点数至少减半,所以执行次数 ;
- 综上 Boruvka 算法的时间复杂度为 ,最坏是 ,最好是 。
KKT 算法
下面我们来介绍线性求最小生成树地算法。
首先我们还要引入一个叫 重/轻边的概念。
假设原图 上有一条边 ,权值为 ,然后在 的最小生成森林中连接 和 的路径中的权值最大的边的权值为 (如果在 中 和 不在一个连通块里就令 )。如果 ,边 就是一条 轻边,反之就是 重边。
然后我们再不加证明的写下两个引理:
- 对于上面定义的 和 ,所有 重边不在 的最小生成树中。
- 若 是 的一个子图,且 包含 中每条边的概率都为 ,然后 是 的一个最小生成森林,则在 中, 轻边的期望数量最多为 。
于是就有了 KKT,算法步骤如下:
- 对 做两次 Boruvka step,节点数变为 ,设这个收缩了的图为 ,如果 中只有一个结点,那么算法结束;
- 构造出 的子图 使得 包含 中每条边的概率都为 ,然后求出 的一个最小生成森林 ,再删除 中的所有 重边得到子图 ;
- 对 做同样的事。
然后 KKT 算法就结束了,我们来算一下它的复杂度。
设对于一个 个结点, 条边的图,KKT 的期望操作次数为 ,那么有:
其中 是一个适当的常数,不等式可以用上面的引理二来解释。
以及可以用归纳法证明 ,易证从略。
参考文献/撒花
R. C. T. Lee, S. S. Tseng, R. C. Chang, Y. T. Tsai. 算法设计与分析导论[M]. 北京:机械工业出版社,2008.
相关推荐
评论
共 3 条评论,欢迎与作者交流。
正在加载评论...