随机收缩算法

本文介绍了随机收缩算法,从图的基本定义出发,包括顶点、边和割,重点讲解了最小割问题和随机收缩算法的工作原理。算法实现中,通过数据结构设计,如使用集合类型的顶点名字来避免重复,并用邻接列表表示顶点关系。最后提到了使用Java进行编码实现。
摘要由CSDN通过智能技术生成

随机收缩算法

最近学习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:

  1. pick a remaining edge (u,v) uniformly at random
  2. merge u and v into a single vertex
  3. remove self-loops

return cut represented by final 2 vertices.

算法实现

数据结构设计

每个顶点有2个属性:顶点的“名字”和顶点的邻接顶点。初始化时,每个顶点的“名字”都是它自己,但是随着收缩步骤的进行,顶点的名字会随之改变。如顶点2和顶点3合并后,将会由一个新“名字”:顶点23。顶点23和顶点34合并后,新顶点名字为234而不是2334,因为我们不需要重复。为了除重,我将顶点“名字”设计为集合类型。顶点的邻接顶点用一个列表表示。
顶点类的设计如下:

public
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值