时间:2021-05-20
基于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文件在上一个并查集的博客中有,就不再粘贴出来了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了C++实现迷宫游戏的具体代码,供大家参考,具体内容如下运用并查集自动生成迷宫地图,并运用队列和栈寻找迷宫通路并打印出来#include#in
本文实例为大家分享了C++实现并查集的具体代码,供大家参考,具体内容如下#include#include#includeusingnamespacestd;cl
本文实例讲述了C++并查集亲戚(Relations)算法。分享给大家供大家参考。具体分析如下:题目:亲戚(Relations)或许你并不知道,你的某个朋友是你的
C/C++程序中需要程序显示当前时间,可以使用标准函数strftime。函数原型:size_tstrftime(char*ptr,size_tmaxsize,c
C++中malloc()和free()函数的理解关于malloc和free这两个函数,malloc的用法示例:int*p=(int*)malloc(2*size