【发布时间】:2021-03-26 15:05:10
【问题描述】:
我所拥有的:集合{1,...,n} 上的等价关系,作为等价对的完整列表给出(a,b)(这已经是传递的;不需要计算传递闭包)。 n 很大(比如说,最多几百万);等效对的总数最多为O(n)(通常要少得多),并且单个等效类很小(我没有这个数字,但是说O(log n))。
我想要的:一种单独枚举所有等价类的方法,即依次获取每个等价类的完整元素集;最多复杂度为O~(n)(在我的代码中执行的所有其他计算都是O(n log(n)),如果可能的话,我绝对不想做任何二次方的事情)。
使用union-find structure 将有助于构造传递闭包(我不需要),但我相信,这对构造等价类没有帮助。我还可以轻松地计算(比如说)每个类中的最小代表(只需扫描完整的等价关系,直到找到它),甚至及时存储它们O(n)(构建一个 1...n 的恒等向量然后扫描完全等价关系,尽可能用最小值代替);但是,这对于枚举等价类也没有多大帮助。
这个问题是否存在经典解决方案?
【问题讨论】:
-
好的,我相信我有一些东西:首先构造(如上)最小代表的向量
v,然后构建具有条目(v[i], i)的稀疏矩阵(这仍然是O(n));这个矩阵的行给出了答案。
标签: complexity-theory union-find equivalence-classes