普林斯顿大学算法公开课(2)----并查集

  并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。web

  Dynamic connectivity算法

  (1)Find query,检查两个物体是否在一个单元中。数组

  (2)Union command,链接2个单元,使得这个单元包含这两个物体。数据结构

  Quick find:id[p] is p的单元id性能

  (1)Find:p and q索引的id是否相同。ui

  (2)Union:合并p=q,则要合并全部条目的id=id[p],id=id[q]。spa

  Quick Union:id[p] is p的i的父节点orm

  (1)Find:检查p和q是否有同一个root。htm

  (2)Union:set p的root为q的root。blog

  Improvement

  (1)Weighted Quick-Union。在进行合并的时候,会首先判断待合并的两棵树的大小即老是size小的树做为子树和size大的树进行合并。这样就可以尽可能的保持整棵树的平衡。

  (2)Weighted Quick-Union With Path Compression。find方法的执行过程当中,不是须要进行一个while循环找到根节点嘛?若是保存全部路过的中间节点到一个数组中,而后在while循环结束以后,将这些中间节点的父节点指向根节点,不就好了么?可是这个方法也有问题,由于find操做的频繁性,会形成频繁生成中间节点数组,相应的分配销毁的时间天然就上升了。那么有没有更好的方法呢?仍是有的,即将节点的父节点指向该节点的爷爷节点,这一点很巧妙,十分方便且有效,至关于在寻找根节点的同时,对路径进行了压缩,使整个树结构扁平化。

  算法性能

  对于Quick-Union算法而言,节点组织的理想状况应该是一颗十分扁平的树,全部的孩子节点应该都在height1的地方,即全部的孩子都直接链接到根节点。这样的组织结构可以保证find操做的最高效率。

  动态连通性相关的Union-Find算法基本上就介绍完了,从容易想到的Quick-Find到相对复杂可是更加高效的Quick-Union,而后到对Quick-Union的几项改进,让咱们的算法的效率不断的提升。这几种算法的时间复杂度以下所示:

Algorithm

Constructor

Union

Find

Quick-Find

N

N

1

Quick-Union

N

Tree height

Tree height

Weighted Quick-Union

N

lgN

lgN

Weighted Quick-Union With Path Compression

N

Very near to 1 (amortized)

Very near to 1 (amortized)

 

相关文章
相关标签/搜索