最小割问题-Karger‘s algorithm

上一篇文章我们提到了最小割问题,最小割问题在研究网络最薄弱环节相关问题上具备广泛应用。而这个问题如今也依旧是一个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:第一步成功的概率为1-\frac{k}{m}

Proof: 共计m条边,其中k条是交叉边,我们是随机选择的。证毕

为了方便我们假设s_{i}代表第i次选中交叉边的事件。由于我们最后需要剩下两个点,而每一次合并操作会减少一个点,因此我们成功的概率可以表示为P\{ \bar{s_{1}} \cap \bar{s_{2}} \cap,\cdots ,\bar{s_{n-2}} \}=P\{\bar{s_{1}}\}P\{\bar{s_{2}} | \bar{s_{1}}\} P\{\bar{s_{3}} |\bar{s_{2}}, \bar{s_{1}}\} \cdots P\{\bar{s_{n-2}} |\bar{s_{n-3}},\cdots, \bar{s_{1}}\}

实际上每一步的选择都是一个马尔科夫过程,至于当前状态有关。

P\{\bar{ s_{1} } \} = 1-\frac{k}{m}

注意,合并操作每一步并不是减少一条边哈,只能保证点的个数减少1。因此我们分析的时候尽量考虑与点的个数发生关系。

我们把所有点的度加总起来应该是边数目的两倍。这个很好理解,考虑两点之间的一条线,每个点的度都为1,度的和为2,边的数目为1。

\sum_{v\in G} \rm {degree(v) }= 2m。 Lemma 1中我们知道每个点的度至少为k,即kn \leq 2m,于是\frac{k}{m}\leq \frac{2}{n}

我们继续分析P\{\bar{s_{2}} | \bar{s_{1}}\} = 1-\frac{k}{\rm{number\ of \ remaining\ edge}}

问题的关键是我们要知道第一次选择后,还剩下多少边?我们知道合并一次之后点肯定从n 变成了n-1,所以根据度的关系,我们知道剩下的边与节点度之和的关系依旧为:

\rm{remaing\ edge}\geq \frac{1}{2}k(n-1),于是\frac{k}{\rm{number\ of \ remaining\ edge}} \leq \frac{2}{n-1}

综上所述,

P\{ \bar{s_{1}} \cap \bar{s_{2}} \cap,\cdots ,\bar{s_{n-2}} \}=P\{\bar{s_{1}}\}P\{\bar{s_{2}} | \bar{s_{1}}\} P\{\bar{s_{3}} |\bar{s_{2}}, \bar{s_{1}}\} \cdots P\{\bar{s_{n-2}} |\bar{s_{n-3}},\cdots, \bar{s_{1}}\} \geq (1-\frac{2}{n})(1-\frac{2}{n-1} ) (1-\frac{2}{n-2} )\cdots (1-\frac{2}{n- (n-2)}) = \frac{n-2}{n} \frac{n-3}{n-1}\frac{n-4}{n-2} \frac{n-5}{n-3} \frac{n-6}{n-4} \cdots \frac{1}{3}

化简得到\geq \frac{1}{n(n-1)}\geq \frac{1}{n^{2}}

而我们执行一次该算法的复杂度为\mathcal{O}(m),该算法复杂度只与边有关系。

我们执行N次该算法,则全部失败的概率为

P\{all fail\}\leq (1-\frac{1}{n^{2}}) ^{N}

我们设N= n^{2 }, P\{all fail\}\leq (e^{-\frac{1}{n^{2}}} )^{n^{2}=\frac{1}{ e }

N=n^{2}\ln nP\{all fail\}\leq \frac{1}{n}

意味着我们只要重复次数足够大,也能求解到最小割。

 

注:文中合并示意图来源于如下微博:

http://blog.kongfy.com/2015/02/kargermincut/

 

 

 

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值