1

我所拥有的: set 上的等价关系{1,...,n},作为等价对的完整列表给出(a,b)(这已经是传递的;不需要计算传递闭包)。n很大(比如说,最多几百万);等效对的总数最多O(n)(通常要少得多),并且单个等效类很小(我没有这个数字,但是说O(log n))。

我想要的是:一种单独枚举所有等价类的方法,即依次获取每个等价类的全套元素;最多具有复杂性O~(n)(在我的代码中执行的所有其他计算都是,如果可能的话O(n log(n)),我绝对不想在该大小上做任何二次方)。

使用union-find 结构将有助于构建传递闭包(我不需要),但我相信,这对构建等价类没有帮助。我还可以轻松地计算(比如说)每个类中的最小代表(只需扫描完整的等价关系,直到找到它),甚至及时存储它们O(n)(构建一个 1...n 的恒等向量,然后扫描完整的等价关系关系,如果可能,用最小值替换);但是,这对于枚举等价类也没有多大帮助。

这个问题是否存在经典解决方案?

4

1 回答 1

0

您可以将其视为图形搜索问题。你得到了组成图的所有边的列表,你想找到它的连通分量。如果你有一个图的邻接列表,这可以在 O(n) 时间内使用 DFS 或 BFS 来完成,因为有 n 个节点和 O(n) 个总边。

幸运的是,您可以在 O(n) 时间内构建一个邻接表。在 O(n) 时间内创建一个包含 n 个列表的数组。然后,遍历边并为每个边 (a, b) 附加 b 到列表编号 a。

总的来说,这使您可以在 O(n) 时间内找到所有等价类(连接的组件)。即使关系不是传递的,这也有效。

于 2021-03-26T15:53:41.343 回答