微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

枚举等价类

如何解决枚举等价类

我所拥有的:集合 {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) 时间内找到所有等价类(连接组件)。即使关系不是可传递的,这也有效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。