c++并查集优化(基于size和rank)

 更新时间:2020年02月13日 11:12:00   作者:五月的天气  
这篇文章主要介绍了c++并查集优化(基于size和rank),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

运行时间是差不多的:

基于size的代码: UnionFind3.h

#ifndef UNION_FIND3_H_
#define UNION_FIND3_H_

#include<iostream>
#include<cassert>

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<iostream>
#include<cassert>

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文件在上一个并查集的博客中有,就不再粘贴出来了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • VC++中HTControl控件类之CHTRichEdit富文本编辑控件实例

    VC++中HTControl控件类之CHTRichEdit富文本编辑控件实例

    这篇文章主要介绍了VC++中HTControl控件类之CHTRichEdit富文本编辑控件,是一个比较实用的功能,需要的朋友可以参考下
    2014-08-08
  • C++核心编程之内存分区模型详解

    C++核心编程之内存分区模型详解

    这篇文章主要为大家介绍了C++核心编程中内存分区模型,C++程序在执行时,将内存大方向分为四个区域,代码区,全局区,栈区,堆区,文章通过代码示例介绍的非常详细,感兴趣的同学可以参考阅读下
    2023-07-07
  • C++使用模板类实现链式栈

    C++使用模板类实现链式栈

    这篇文章主要为大家详细介绍了C++使用模板类实现链式栈,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C++实现屏幕截图功能

    C++实现屏幕截图功能

    这篇文章主要为大家详细介绍了C++实现屏幕截图功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 利用C语言实现扫雷游戏

    利用C语言实现扫雷游戏

    这篇文章主要为大家详细介绍了利用C语言实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Qt QStandardItemModel用法小结

    Qt QStandardItemModel用法小结

    QStandardItemModel可用作标准Qt数据类型的存储库,本文主要介绍了Qt QStandardItemModel用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • 详解C语言中sizeof如何在自定义函数中正常工作

    详解C语言中sizeof如何在自定义函数中正常工作

    在main函数中,sizeof是可以正常工作的,但是在自定义函数中就不可以了。所以本文将为大家详细讲解一下如何解决这一问题,感兴趣的可以了解一下
    2022-05-05
  • C++深入讲解类与对象之OOP面向对象编程与封装

    C++深入讲解类与对象之OOP面向对象编程与封装

    学习过C语言的小伙伴知道:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题,接下来让我们详细的了解
    2022-05-05
  • C++下如何将TensorFlow模型封装成DLL供C#调用

    C++下如何将TensorFlow模型封装成DLL供C#调用

    这篇文章主要介绍了C++下如何将TensorFlow模型封装成DLL供C#调用问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++智能指针shared_ptr分析

    C++智能指针shared_ptr分析

    这篇文章主要介绍了C++智能指针shared_ptr分析的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论