随机收缩算法
最近学习Tim Roughgarden 的Algorithm课程,就写一下笔记吧。
一些基本定义
图(graph)
一个图由两部分组成:顶点(vertex)和边(edge)。顶点集用V表示,边集用E表示。
图可以分为有向图和无向图。
割(cut)
一个图(V,E)的割指的是对图(V,E)的顶点集的一个分割,使得顶点集V分为两个非空子集A和B。
一个连通图的割的数量为 22 – 2个。
连接边(crossing edge)
- 对无向图来说,连接边指的是边的两个顶点分别在A或B中。
- 对有向图来说,连接边指的是头在B中,尾在A中。
最小割问题
输入:一个无向图G=(V,E).
输出:图的一种割法,使得连接边的数量最少。
Random Contraction Algorithm
如其名,这是一个随机算法,由Karger在上世纪90年代初提出。其基本思想如下:
While there more than 2 vertices:
- pick a remaining edge (u,v) uniformly at random
- merge u and v into a single vertex
- remove self-loops
return cut represented by final 2 vertices.
算法实现
数据结构设计
每个顶点有2个属性:顶点的“名字”和顶点的邻接顶点。初始化时,每个顶点的“名字”都是它自己,但是随着收缩步骤的进行,顶点的名字会随之改变。如顶点2和顶点3合并后,将会由一个新“名字”:顶点23。顶点23和顶点34合并后,新顶点名字为234而不是2334,因为我们不需要重复。为了除重,我将顶点“名字”设计为集合类型。顶点的邻接顶点用一个列表表示。
顶点类的设计如下:
public