0

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

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

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

4

1 回答 1

0

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

要实现这一点,您只需要修改 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)];
}
于 2019-05-04T15:09:14.450 回答