这是参考 Robert Sedgewick 和 kevin Wayne 所著的《算法(第四版)》一书
对于 Union-find 实现,find 和 union 的代码如下(第 222 页)给出:
public int find(int p)
{
return id[p];
}
public void union(int p, int q)
{
// Put p and q into the same component.
int pID = find(p);
int qID = find(q);
// Nothing to do if p and q are already in the same component.
if (pID == qID) return;
// Rename p’s component to q’s name.
for (int i = 0; i < id.length; i++)
if (id[i] == pID) id[i] = qID;
count--;
}
然后是一个命题:
命题 F。快速查找算法对 find() 的每次调用使用一次数组访问,对结合两个组件的 union() 的每次调用使用 N + 3 到 2N + 1 次数组访问。
我想了解我们实际上是如何到达N + 3和2N + 1的。我对 N + 3 有一些想法,但对 2N + 1 不知道。请帮忙。