这是参考Robert Sedgewick所着的算法(Fouth Edition)&凯文韦恩
对于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()以及N + 3和2N + 1之间的数组访问 调用union(),它结合了两个组件。
我想了解我们是如何实际到达 N + 3 和 2N + 1 的。我对N + 3有一些了解,但不知道2N + 1.请帮忙。
答案 0 :(得分:1)
对于我们pID != qID
的情况:
2次访问:
int pID = find(p);
int qID = find(q);
在和N访问:
if (id[i] == pID)
到目前为止N + 2,但由于pID != qID
至少p有pID!=qID
所以我们将再次访问if语句:id[i] = qID;
所以我们将访问数组至少N = 3次。
在最坏的情况下,所有N个元素都有ID pID
,我们将执行id[i] = qID;
N-1次(不仅仅是之前一次,N-1因为q有qID
所以我们将不要访问数组q)所以总体来说: 2 + N (如果所有N个元素访问的for循环中的条件)+ N-1 (对于id[i] = qID;
)= 2N + 1 。
示例:
如果数组看起来像:qID qID qID pID qID
(5个元素)
然后调用union(1,4)
// 1索引是第一个元素(带有qID),4是第4个(pID)
你将在开始时有2次访问,5对于if条件,只有1次条件为真 - 对于4元素是唯一一个有pID的元素,所以你有2+5+1 =8= N+3
最小值。
现在举例来说,使用max accessses获取数组:qID pID pID pID pID
现在你将2+5 + 4
(因为有四个条件为真)= 11 = 2N+1
(N = 8)。