【问题标题】:Union find algorithm in Kruskals algorithmKruskals算法中的联合查找算法
【发布时间】:2021-03-20 15:03:22
【问题描述】:

这两个函数是如何工作的?

函数find的时间复杂度是O(log n) 假设长度 每条链的长度为 O(log n)。在这种情况下,相同和统一的功能也适用于 O(log n) 时间。函数 unite 确保每条链的长度是 O(log n) 通过将较小的集合连接到较大的集合。

有人可以举个例子解释一下吗?

int find(intx) {
while(x != k[x]) x = k[x];
returnx;
}
bool same(inta,intb) {
returnfind(a) == find(b);
}
void unite(inta,intb) {
a = find(a);
b = find(b);
if(s[a] < s[b]) swap(a,b);
s[a] += s[b];
k[b] = a;
}

【问题讨论】:

    标签: data-structures tree minimum-spanning-tree kruskals-algorithm union-find


    【解决方案1】:

    你得到 O(log n) 复杂度与 O(n) 因为你总是在 unite() 函数中将较小的集合连接到较大的集合(相对于较大的集合到较小的集合)。如果一个集合等于或小于另一个集合,则较小集合的最大可能是较大集合(最坏情况)的大小,但通常会更小。例如,如果总共有 20 个元素,则两个大小可能是 1 和 19、2 和 18,一直到 10 和 10。净是当你合并两个簇时,它的大小最多会翻倍,这意味着它最多将其深度增加一个级别。因此,上树最多需要 log2N 步 b/c,这是最大深度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多