Union-Find性能解释

时间:2017-09-26 11:14:00

标签: algorithm union-find

这是参考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.请帮忙。

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)。