c++并查集优化的示例分析

小编给大家分享一下c++并查集优化的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、成都小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了泰宁免费建站欢迎大家使用!

基于size的优化是指:当我们在指定由谁连接谁的时候,size数组维护的是当前集合中元素的个数,让数据少的指向数据多的集合中

基于rank的优化是指:当我们在指定由谁连接谁的时候,rank数组维护的是当前集合中树的高度,让高度低的集合指向高度高的集合

运行时间是差不多的:
c++并查集优化的示例分析

基于size的代码: UnionFind3.h

#ifndef UNION_FIND3_H_
#define UNION_FIND3_H_

#include
#include

namespace UF3
{
	class UnionFind
	{
	private:
		int* parent;
		int* sz;  //sz[i]就表示以i为根的集合中元素的个数
		int count;

	public:
		UnionFind(int count)
		{
			this->count = count;
			parent = new int[count]; 
			sz = new int[count];
			for(int i = 0 ; i < count ; i++)
			{
				parent[i] = i;
				sz[i] = 1;
			}

		}

		~UnionFind()
		{
			delete [] parent;
			delete [] sz;
		}

		int find(int p)
		{
			assert(p < count && p >= 0); 
			while( p != parent[p]) //这个是写到find里面的
			{
				p = parent[p];
			}

			return p;
		}

		void unionElements(int p , int q)
		{

			int pRoot = find(p);
			int qRoot = find(q);

			if( pRoot == qRoot)
				return;
			if(sz[pRoot] < sz[qRoot])
			{
				parent[pRoot] = qRoot;
				sz[qRoot] += sz[pRoot];
			}
			else
			{
				parent[qRoot] = pRoot;
				sz[pRoot] += sz[qRoot];
			}

		}

		bool isConnected(int p , int q)
		{
			return find(p) == find(q);
		}


	};
};


#endif

基于rank的代码: UnionFind4.h

#ifndef UNION_FIND4_H_
#define UNION_FIND4_H_

#include
#include

namespace UF4
{
	class UnionFind
	{
	private:
		int* parent;
		int* rank;  //rank[i]就表示以i为根的集合的层数
		int count;

	public:
		UnionFind(int count)
		{
			this->count = count;
			parent = new int[count]; 
			rank = new int[count];
			for(int i = 0 ; i < count ; i++)
			{
				parent[i] = i;
				rank[i] = 1;
			}

		}

		~UnionFind()
		{
			delete [] parent;
			delete [] rank;
		}

		int find(int p)
		{
			assert(p < count && p >= 0); 
			while( p != parent[p]) //这个是写到find里面的
			{
				p = parent[p];
			}

			return p;
		}

		void unionElements(int p , int q)
		{

			int pRoot = find(p);
			int qRoot = find(q);

			if( pRoot == qRoot)
				return;
			if(rank[pRoot] < rank[qRoot])
			{
				parent[pRoot] = qRoot;
			}
			else if( rank[pRoot] > rank[qRoot] )
			{
				parent[qRoot] = pRoot;
			}
			else
			{
				parent[pRoot] = qRoot; //这里谁指向谁无所谓
				rank[qRoot] ++;
			}

		}

		bool isConnected(int p , int q)
		{
			return find(p) == find(q);
		}


	};
};


#endif

剩下的头文件和main文件在上一个并查集的博客中有,就不再粘贴出来了

以上是“c++并查集优化的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!


网页标题:c++并查集优化的示例分析
标题URL:http://pwwzsj.com/article/jcphis.html