Princeton-Algorithm-Union Find

2016-10-24  本文已影响0人  kevinscake

该文章为Princeton-Algorithms Part I读书笔记,相关视频在此。

1. 算法用于解决的问题: Dynamic Connectivity

1.1 两个操作:Union & Find

Union & Find

关键:ObjectS + Union + Find

1.2 Connected Component

Connected Components

2. 实现

2.1 Quick-Find

是一种eager approach,why?

Find(p, q): 查看各自的id是否相等
Union(p, q): 将所有与p的id相同的objects的id设置为与q的id相等

2.2 Quick-Union

是一种lazy approach

Find(p, q): 查看各自的root是否相等
Union(p, q): 将p的root的id设置为q的root的id

可以从所维护的树的角度来考虑:
quick find: 树是平的,union之后改动很大
quick union: union虽然只需要对树一次改动,但是可能树很高,find花很长时间

3.优化

3.1 方法1: weighting

java实现

为什么O(lgN)呢?因为一个节点最大深度只能为lgN
证明:
考虑一个节点x,什么时候深度才会递增1?当它所在的树小于要union的那棵树时。因此union之后,它所在的树的节点数翻倍。由于总节点数为N,因此x所在的树由节点数为1开始,最多能翻倍lgN次,即x的深度最多是lgN。

3.2 方法2:path compression

4. 应用

4.1 Percolation穿透问题

percolation model

具有NXN的区域,每个单元格有一定的概率要么空,要么填充。问题是求解是否上边能穿透到下底。

更实际的应用有电路问题,流水问题,社交问题等

percolation application

此外,还有一个关于如何得到percolation threshold(穿透阈值)的实验:

estimate percolation threshold

技巧:引入上下两个virtual site便于check是否上边与下底相连

算法的发展思路
上一篇下一篇

猜你喜欢

热点阅读