【问题标题】:How to implement the operation FindMin(x) on a union-find data structure?如何在联合查找数据结构上实现 FindMin(x) 操作?
【发布时间】:2023-03-15 02:17:01
【问题描述】:

S 表示从 1 到 n 的整数集合。考虑 union-find 数据结构,其中 - 除了操作 union(A, B) 和 find(x) - 您对返回 x 所属集合的最小元素感兴趣。

建议一种数据结构,使您可以有效地实现这些操作并分析 m find、p findMin 和最多 (n - 1) 个联合的序列的运行时间。

我知道我应该以某种方式对 x 所属的集合的元素进行排序(所以,我首先找到集合,然后对它进行排序,这应该花费 O(nlogn) 加上查找操作使用的时间,这取决于数据结构...)。我应该使用具有平衡联合和路径压缩的联合查找吗?对不起,我很困惑!

【问题讨论】:

    标签: data-structures minimum union-find


    【解决方案1】:

    您需要做的就是将最小元素存储在分离集的根中。

    要实现这一点,你只需要修改 Union() 以便在合并 2 个集合后,它也会更新不相交集合的最小元素。

    所以所有操作仍然是 O(log n)(如果使用路径压缩或按秩联合)

    甚至 O(inverse_ackerman)(如果同时使用两种优化)

    伪代码(仅使用路径压缩,所以所有操作都是 O(log n)):

    const int N = 10;
    
    int P[N+1]; //stores parent of each set, initially all elements set to -1 to indicate no parent
    int Min[N+1];//stores min element of each set
    
    int Find(int u)
    {
        return P[u] < 0 ? u : P[u] = Find(P[u]);
    }
    
    void Union(int u, int v)
    {
        u = Find(u);
        v = Find(v);
        if(u == v)return;
        Min[u] = Min[u] < Min[v] ? Min[u] : Min[v]; 
        P[v] = u; 
    }
    
    int FindMin(int u)
    {
        return Min[Find(u)];
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 2012-07-30
      • 2015-04-25
      • 2020-03-13
      相关资源
      最近更新 更多