最近几天为一些事务所缠,没怎么好好看,罪过罪过。。。
解决连通问题,用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效率高。
博客讨论了解决连通问题的算法。指出Quick-find算法在处理大数组时效率低,介绍了Quick-union算法,其实现不用遍历数组。通过代码展示了该算法,原理与Quick-find类似,用两个for语句回溯实现,通常搜索数组元素少,效率更高。
-读书笔记(2)&spm=1001.2101.3001.5002&articleId=273606&d=1&t=3&u=3336be3f8e8d4870be2ae93ada0dbaef)

被折叠的 条评论
为什么被折叠?



