算法I-IV(C++实现)-读书笔记(2)

来源:互联网 发布:11.4恒大淘宝的比赛 编辑:程序博客网 时间:2024/05/01 13:00

最近几天为一些事务所缠,没怎么好好看,罪过罪过。。。

解决连通问题,用Quick-find的话似乎效率不高,尤其是for语句遍历整个数组的实现在遇见数组牛大的时候会导致效率牛低。
接下去的这个算法叫做Quick-union,它的实现不用遍历数组。

// Quick-union solution to connectivity problem

#include <iostream>
using namespace std;

static const int N = 10000;

int main()
  {int i,j, p, q, id[N];
   for (i = 0; i < N; i++) id[i] = i;
   while (cin >> p >> q)
     {for (i = p; i != id[i]; i = id[i]) ;
      for (j = q; j != id[j]; j = id[j]) ;
      if (i == j) continue;
      id[i] = j;
      cout << " " << p << " " << q << endl;
     }
   }

原理和Quick-find一样,建立一个数组,判断数组下标对应的数字是否连通(connectivity)的依据是下标对应的数组值是否相同。
但是它用了两个for语句形成一个回溯的实现(可能用语不恰当)输入p,q,第一个for语句先将p赋值给i,然后直接从第id[p]开始检测,当i不等于id[p],即id[p]已经与其他数字连通时,进入循环,通过i = id[i]回溯所有连通的数字,然后用 id[i] = j;将这些数字连通(数组值一样)。
这个方法明显在通常情况下搜索数组元素较少,比Quick-find效率高。