【问题标题】:Distance to representative in Disjoint set union data structure不相交集联合数据结构中与代表的距离
【发布时间】:2021-08-22 09:27:59
【问题描述】:

来自cp-algorithms网站:

有时在 DSU 的特定应用中,您需要保持顶点与其集合的代表之间的距离(即树中从当前节点到树根的路径长度)。

并给出以下代码作为实现:

void make_set(int v) {
    parent[v] = make_pair(v, 0);
    rank[v] = 0;
}
pair<int, int> find_set(int v) {
    if (v != parent[v].first) {
        int len = parent[v].second;
        parent[v] = find_set(parent[v].first);
        parent[v].second += len;
    }
    return parent[v];
}
void union_sets(int a, int b) {
    a = find_set(a).first;
    b = find_set(b).first;
    if (a != b) {
        if (rank[a] < rank[b])
            swap(a, b);
        parent[b] = make_pair(a, 1);
        if (rank[a] == rank[b])
            rank[a]++;
    }
}

我不明白这种与代表的距离有何用处,因为它仅表示与我们数据结构中的集合领导者的距离,这可能与我们的原始问题无关。
我尝试了几个示例来查看当我们执行 union_sets 和 make_set 之类的操作时距离如何变化,但没有弄清楚任何事情。我的问题是这种“与代表的距离”代表什么,或者说它的意义或用途是什么。 任何可视化或理解它的帮助表示赞赏。

【问题讨论】:

    标签: c++ algorithm data-structures disjoint-union


    【解决方案1】:

    一个不相交的集合结构通常应该像你的那样使用按等级或大小和路径压缩的联合,否则它会变得非常慢。

    这些操作以与您的问题无关的方式更改路径长度,因此很难想象剩余的路径长度信息对任何目的都有用。

    但是,可能存在与“原始路径”相关的有用信息,即您将获得没有路径压缩或按等级联合的信息,并且可以通过这些操作将这些信息保存在额外的字段中。例如,请参阅此答案:How to solve this Union-Find disjoint set problem?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 2011-01-20
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      相关资源
      最近更新 更多