【问题标题】: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)];
}