我正在阅读有关着名的联合发现问题的内容,而且这本书说:“要么发现,要么工会需要花费O(n)
时间,另一部分需要{ {1}} ....“
但是如何使用位字符串来表示集合呢?
然后,两个联合(使用位OR)和查找(迭代通过集合列表检查相应的位是O(1)
)将采用1
..
这种逻辑有什么问题?
答案 0 :(得分:6)
这两项操作都可以在O(Alpha(n))
的摊还时间内完成,其中Alpha为inverse of the Ackermann function
(缓慢增长 非常 )。你必须将问题表示为福雷斯特。选择某个子图(树节点)的代表,并且联合操作将合并树(将较小的树挂在较高的根下面)。 union操作只是遍历到根并缩短遍历的路径(挂起根目录下的搜索元素(可能是所有遍历的元素)。
答案 1 :(得分:3)
使用位域
or
,但如果n很大,你显然不能使用内置类型。此外,位域并不适合任意组。例如,如果您有一个可以包含任何32位整数的集合,则需要一个大小为4G / 8 = 0.5G的位域。