并查集实现(c++)

1.何为并查集? 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题,简单的说就是对集合操作的一种数据结构。

2.做什么用: 考虑这样一个问题—— 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。一个家族可以看做一个集合,所以这里有两个集合,需要判断其中的两个成员是否在一个集合内。

3.并查集的实现: 顾名思义  并查集需要干的事情就是  合并查找 ,  合并就是将两个不相关的集合相关联,查找就是查成员的所在集合。因此实现上  就是两个函数 一个find()   一个 join(),   下面先看代码:

// 并查集
#ifndef _UNITFINDSET_H_
#define _UNITFINDSET_H_

#define MAX_NUM 1024


class UniteFindSet
{
public:
	UniteFindSet(int num);
	~UniteFindSet();
	void join(int root1, int root2);
	int find(int root);
	bool isConnect(int root1, int root2);


private:
	int par[MAX_NUM];      //存放第i个元素的父节点
};



UniteFindSet::UniteFindSet(int num)
{
	for(int i=0; i< num; i++)
		par[i] = i;

	
}

int UniteFindSet::find(int root)
{
	int tmp = 0;
	int son = root;
	while(root != par[root])   
	{
		root = par[root];
	}
	while(son != root)  //路径压缩优化, 
	{
		tmp = par[son];
		par[son] = root;
		son = tmp;
	}
	return root;
}

void UniteFindSet::join(int root1, int root2)
{
	int x = find(root1);
	int y = find(root2);
	if(x == y)
		return;
	else
		par[x] = y;
}

bool UniteFindSet::isConnect(int root1, int root2)
{
	return find(root1) == find(root2);
}

#endif

       不难看出,核心的代码就是find() 函数, 在UniteFindSet里,有一个 数组par[],  它存放的是父节点信息,例如i的父节点就是 par[i],find 函数做的事情就是 找到属于自己的 “老大”,即根节点。
       路径压缩,则是 为了后续查找方便,因为当数据量很大的时候,频繁的向上查找根节点时影响性能,因此当做完一次find

时,将根节点下的所有子节点  直接连在根节点上面。

你可能感兴趣的:(数据结构,算法)