我所拥有的: set 上的等价关系{1,...,n}
,作为等价对的完整列表给出(a,b)
(这已经是传递的;不需要计算传递闭包)。n
很大(比如说,最多几百万);等效对的总数最多O(n)
(通常要少得多),并且单个等效类很小(我没有这个数字,但是说O(log n)
)。
我想要的是:一种单独枚举所有等价类的方法,即依次获取每个等价类的全套元素;最多具有复杂性O~(n)
(在我的代码中执行的所有其他计算都是,如果可能的话O(n log(n))
,我绝对不想在该大小上做任何二次方)。
使用union-find 结构将有助于构建传递闭包(我不需要),但我相信,这对构建等价类没有帮助。我还可以轻松地计算(比如说)每个类中的最小代表(只需扫描完整的等价关系,直到找到它),甚至及时存储它们O(n)
(构建一个 1...n 的恒等向量,然后扫描完整的等价关系关系,如果可能,用最小值替换);但是,这对于枚举等价类也没有多大帮助。
这个问题是否存在经典解决方案?