Cousera 公开课Princeton Algorithms Part 1笔记:Union-Find

1.Dynamic Connectivity

首先介绍了基本的关于dynamic connectivity的概念

两个操作: union command的作用是连接两个对象。find query是检查是否两个对象连通

然后 说明连接是一个等价关系(抽象代数中有具体的定义和延伸)

提到了connected components:数量最多的那组相互连通的对象组成的集合

定义了一个union find数据结构 以下是API


2.Quick Find

提出了quick find算法 下面是其数据结构

同样定义了两个操作:查找和连接

然后进行了一些动态展示和java代码实现

最后提出了这种算法的cost model

这里的N次指的是运行算法过程中需要进入数组的次数。可以想象 N*N此操作是平方的时间复杂度了,所以这个算法很慢。


3.Quick Union

介绍了新的一种算法。以下是数据结构以及不同的解释

一种类似树状图的结构

在这样的情况下 新的union命令就只用将p的root的id改为与q的root id相等。所以只有一次union 只有一个改变


然后进行动态演示和java代码实现。下面是这个算法的cost

可以发现find的cost太高了

两种算法的对比

4.Quick Union Improvements

在这一小节 对quick union提出了一些改进。

第一个改进是weighed (也就是在union的时候把size比较小的那个tree的root连到大的tree的root上)有效防止tree太高)在数据结构的改进上加入了一个数组sz[]用来记录tree的size

再对算法进行了分析

第二个提升办法是路径压缩。只需要在计算出root之后 把每个node的id设为root就行

第三个结合了weighted quick-union和path compression

在理论上 这个算法是非线性。实际中是线性

最后总结以上算法

5.Application

讲述了动态连接解决percolation的过程

推荐阅读更多精彩内容