前言
在前两次的博客中已经介绍了Quick-Find,Quick-Union算法,这两个算法或多或少都有不足,这一次我们学习最终豪华版的Union-Find算法。
Union-Find算法
在Quick-Union中我们已经采用了“树”的概念,但Quick-Find算法的union会出现极端情况,也就是产生一课光杆司令的树,这种树会极大的增加时间复杂度,不利于大的数据处理。所以我们在原有的基础上提出优化策略:
union优化策略
就是我们在每次union之前先来判断一下两个树所在的“树”的大小,然后将小的树的根连接到大的树的根上。这样可以有效避免变态树的产生,有效的减少程序的时间复杂度。
我们定义根节点的ID值为负的size(树的大小)
find优化策略
路径压缩,find在由叶子节点向上寻找根的过程中将这一条枝上的叶子的ID改为根节点的ID,这样可以让树变得扁平,提高效率。
先上代码,依然是那熟悉的C++:
class quick_union
{
private:
//sz_array is used to record the size of connected components
int sz[10];
//the count of connected components
int cnt = 0;
public:
//initialize the ID_array and size array
void init(int *p_ID, int n){
cnt = n;
int i;
for(i = 0; i < n; i++){
p_ID[i] = -1;
}
}
//find the root of numbers
int find(int *p_ID, int num){
if(p_ID[nu