算法练习(97): 加权 quick-find 分析(1.5.10-1.5.11)

本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本人新建了一个微信群(算法交流),想要加入的,请添加我的微信号:zhujinhui207407 谢谢。另外,本人的个人博客 http://www.kyson.cn 也在不停的更新中,欢迎一起讨论

算法(第4版)

知识点

  • 加权 quick-find 算法

题目

1.5.10 在加权 quick-union 算法中,假设我们将 id[find(p)] 的值设为 q 而非 id[find[q]],所得的算法是正确的吗?答:是,但这会增加树的高度,因此无法保证同样的性能。


1.5.10 In the weighted quick-union algorithm,suppose that we set id[find(p)] to q instead of to id[find(q)]. Would the resulting algorithm be correct?Answer : Yes, but it would increase the tree height, so the performance guarantee would be invalid.

分析

我们看看find函数的代码

private int find(int p) {  // Follow links to find a root.
    while (p != id[p]) p = id[p];
    return p;
}

然后看一下union函数

public void union(int p, int q) {
    int i = find(p);
    int j = find(q);
    if (i == j) return;
    // Make smaller root point to larger one.
    if (sz[i] < sz[j]) {
        id[i] = j;
        sz[j] += sz[i];
    } else {
        id[j] = i;
        sz[i] += sz[j];
    }
    count--;
}

如果按题目中所说,做如下改动

public void union(int p, int q) {
    int i = find(p);
    int j = find(q);
    if (i == j) return;
    if (sz[i] < sz[j]) {
        id[i] = q;//改动1,将q直接作为id[i]的子节点
        sz[j] += sz[i];
    } else {
        id[j] = p;//改动2,将p直接作为id[j]的子节点
        sz[i] += sz[j];
    }
    count--;
}

我们仍然通过轨迹图来展示树的变化,以书中的图例为例:



显而易见,树的高度增加了。

答案

见分析

题目

1.5.11 实现加权 quick-find 算法,其中我们总是将较小的分量重命名为较大分量的标识符。
这种改变会对性能产生怎样的影响?


1.5.11 Implement weighted quick-find, where you always change the id[] entries of the smaller component to the identifier of the larger component. How does this change affect performance?

分析

题目尚未看懂,待分析

答案

你可能感兴趣的:(算法练习(97): 加权 quick-find 分析(1.5.10-1.5.11))