溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

c++基于size和rank并查集優(yōu)化是怎樣的

發(fā)布時(shí)間:2021-10-15 15:33:08 來源:億速云 閱讀:135 作者:柒染 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)c++基于size和rank并查集優(yōu)化是怎樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

基于size的優(yōu)化是指:當(dāng)我們?cè)谥付ㄓ烧l連接誰的時(shí)候,size數(shù)組維護(hù)的是當(dāng)前集合中元素的個(gè)數(shù),讓數(shù)據(jù)少的指向數(shù)據(jù)多的集合中

基于rank的優(yōu)化是指:當(dāng)我們?cè)谥付ㄓ烧l連接誰的時(shí)候,rank數(shù)組維護(hù)的是當(dāng)前集合中樹的高度,讓高度低的集合指向高度高的集合

運(yùn)行時(shí)間是差不多的:

基于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為根的集合中元素的個(gè)數(shù)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]) //這個(gè)是寫到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為根的集合的層數(shù)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]) //這個(gè)是寫到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

關(guān)于c++基于size和rank并查集優(yōu)化是怎樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI