枚举等价类

问题描述

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

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

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

这个问题有经典的解决方案吗?

解决方法

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

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...