联合查找算法

时间:2011-10-12 09:16:23

标签: algorithm time-complexity union-find

我正在阅读有关着名的联合发现问题的内容,而且这本书说:“要么发现,要么工会需要花费O(n)时间,另一部分需要{ {1}} ....“

但是如何使用位字符串来表示集合呢? 然后,两个联合(使用位OR)和查找(迭代通过集合列表检查相应的位是O(1))将采用1 ..

这种逻辑有什么问题?

2 个答案:

答案 0 :(得分:6)

这两项操作都可以在O(Alpha(n))的摊还时间内完成,其中Alpha为inverse of the Ackermann function(缓慢增长 非常 )。你必须将问题表示为福雷斯特。选择某个子图(树节点)的代表,并且联合操作将合并树(将较小的树挂在较高的根下面)。 union操作只是遍历到根并缩短遍历的路径(挂起根目录下的搜索元素(可能是所有遍历的元素)。

答案 1 :(得分:3)

使用位域

  • union将成为O(n)。你假设你可以在两个原生整数上做一个简单的位or,但如果n很大,你显然不能使用内置类型。
  • 发现将是O(1)。您不必迭代,您知道该位的确切位置。

此外,位域并不适合任意组。例如,如果您有一个可以包含任何32位整数的集合,则需要一个大小为4G / 8 = 0.5G的位域。