上一篇文章我们提到了最小割问题,最小割问题在研究网络最薄弱环节相关问题上具备广泛应用。而这个问题如今也依旧是一个open problem。而今天我们就介绍一种求解最小割问题的概率型算法-Karger's algorithm。 该算法是karger读博期间发现的一种非常简单的算法。
其核心步骤就是我们随机在图上找两个点进行 constraction 合并操作。如下图所示:
注意2,3由于合并为了一个点,所以2 3两点之间的边我们就当做没有了,同时要消除由于合并形成的自环。
重复上述步骤到图只剩下两个点为止。
是的,这就是全部的步骤,是不是太简单了?同学们肯定好奇,这么简单,开玩笑,能有用吗?
接下来我们就分析一下这个算法到底能不能有用。
为了方便起见,我们就假设我们上面的分法就是最小割的情形了。红色虚线我们成为交叉边(cross edges),我们假设交叉边一共有k条, 总共的边一共是m条,即最小割为k。
Lemma 1:图中每个顶点的度至少为k。
Proof:一个顶点的度意为该顶点有多少条边。由于最小割为k,那么我们总能将图中的顶点分成这样的一种情况,即我们目标的顶点在A,其余剩下的点全部在B,由于最小割是k,所以该顶点至少有k条边。 证毕
我们继续考虑,什么情况下我们的算法能够成功呢?如果某一个步中我们constraction的边恰好是交叉边呢?显然,如果是这种情况,那么本来应该分别在A B中的点就会在同一边,算法失败。所以,算法成功的条件必须是每一步算法都选到不是交叉边的边合并。
Lemma 2:第一步成功的概率为
Proof: 共计m条边,其中k条是交叉边,我们是随机选择的。证毕
为了方便我们假设代表第i次选中交叉边的事件。由于我们最后需要剩下两个点,而每一次合并操作会减少一个点,因此我们成功的概率可以表示为
实际上每一步的选择都是一个马尔科夫过程,至于当前状态有关。
注意,合并操作每一步并不是减少一条边哈,只能保证点的个数减少1。因此我们分析的时候尽量考虑与点的个数发生关系。
我们把所有点的度加总起来应该是边数目的两倍。这个很好理解,考虑两点之间的一条线,每个点的度都为1,度的和为2,边的数目为1。
即。 Lemma 1中我们知道每个点的度至少为k,即
,于是
。
我们继续分析
问题的关键是我们要知道第一次选择后,还剩下多少边?我们知道合并一次之后点肯定从n 变成了n-1,所以根据度的关系,我们知道剩下的边与节点度之和的关系依旧为:
,于是
综上所述,
化简得到。
而我们执行一次该算法的复杂度为,该算法复杂度只与边有关系。
我们执行N次该算法,则全部失败的概率为
我们设,
设,
意味着我们只要重复次数足够大,也能求解到最小割。
注:文中合并示意图来源于如下微博:
http://blog.kongfy.com/2015/02/kargermincut/