【问题标题】:Enumerating equivalence classes枚举等价类
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-10-17
    • 2019-01-18
    • 2010-10-09
    • 1970-01-01
    • 2011-03-15
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多