union find并查集 (algorithm course Of Princeton )

来源:互联网 发布:最贵的域名 编辑:程序博客网 时间:2024/05/02 02:03

Week 1

         第一周:unionfind problem (并查集问题)

         解决动态连接问题


目标:

 

Quick find 算法 解决动态连接问题


解释:

         快速查找算法思想是用一个数组来代表可能的节点,如果两个不同下标中的值相同的话则说明两个点相连,如果拥有不同的id,说明他们不相连。


         分析:

Union 操作是个耗时的操作,如果对 N 个元素执行 N 次 union 操作,数组访问次数就是 N^2 次,当N变得很大的时候,效率会很差


Quick find方法对于union find问题太慢了

 

方法2:quick union


 

解释:

         用数组来抽象表示树形结构。

         id[i]表示的就是i的父亲节点

        

         判断是否联通:比较他们是否有相同的root

         Union(a,b):将a的root 设置为id[b]的值即可



算法分析:

         当树非常高的时候耗时也是非常高的

         Find操作耗时比较多 最高可以到N  全部是左树


提升:

改进(weighted quick-union ):

        问题所在:寻找根节点时间消耗与树的高度成正比

         所以改进quickunion算法的一个方法是尽可能减小树的高度。

         措施:union时将小的树加到较大的书的根节点上

         算法:维护一个size[i]用于计算以i为根的树的对象的数量



算法实现:将较小的树加到较大的树的根节点上。



分析:connect 时,由于connect 时需要找到目标节点的根节点所以时间花费还是很高。


改进2: path compression (weighted quick-union with path compression)

算法思想:当我们寻找某个节点的根节点时,我们将所经过路径所有节点的直接父节点指向root 

算法分析:

Union find 算法应用:




0 0