国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

高階數(shù)據(jù)結(jié)構(gòu) ——— 并查集

這篇具有很好參考價值的文章主要介紹了高階數(shù)據(jù)結(jié)構(gòu) ——— 并查集。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

并查集

  • 并查集是一種樹型的數(shù)據(jù)結(jié)構(gòu),用于處理一些不相交集合的合并及查詢問題。
  • 并查集通常用森林來表示,森林中的每棵樹表示一個集合,樹中的結(jié)點對應(yīng)一個元素。

說明一下: 雖然利用其他數(shù)據(jù)結(jié)構(gòu)也能完成不相交集合的合并及查詢,但在數(shù)據(jù)量極大的情況下,其耗費的時間和空間也是極大的。

并查集的原理

并查集的原理

以朋友圈為例,現(xiàn)在有10個人(從0開始編號),剛開始這10個人互不認(rèn)識,所以各自屬于一個集合。如下:

高階數(shù)據(jù)結(jié)構(gòu) ——— 并查集

并查集會用一個數(shù)組來表示這10個人之間的關(guān)系,數(shù)組的下標(biāo)對應(yīng)就是這10個人的編號,剛開始時數(shù)組中的元素都初始化為-1。如下:

高階數(shù)據(jù)結(jié)構(gòu) ——— 并查集

說明一下:

  • 數(shù)組中某個位置的值為負(fù)數(shù),表示該位置是樹的根,這個負(fù)數(shù)的絕對值表示的這棵樹(集合)中數(shù)據(jù)的個數(shù),因為剛開始每個人各自屬于一個集合,所以將數(shù)組中的位置都初始化為-1。

后來這10個人之間通過相互認(rèn)識,最終形成了三個朋友圈。如下:

高階數(shù)據(jù)結(jié)構(gòu) ——— 并查集

此時并查集數(shù)組中各個位置的值如下:

高階數(shù)據(jù)結(jié)構(gòu) ——— 并查集

說明一下:

  • 數(shù)組中某個位置的值為非負(fù)數(shù),表示該位置不是樹的根,這個非負(fù)數(shù)的值就是這個結(jié)點的父結(jié)點的編號。

后來4號和8號又通過某種機(jī)遇互相認(rèn)識了,這時他們所在的兩個集合就需要進(jìn)行合并,最終就變成了兩個朋友圈。如下:

高階數(shù)據(jù)結(jié)構(gòu) ——— 并查集

需要注意的是,在根據(jù)兩個元素合并兩個集合時,需要先分別找到這兩個元素所在集合的根結(jié)點,然后再將一個集合合并到另一個集合,并且合并后需要更新數(shù)組中根結(jié)點的值。

示意圖如下:

高階數(shù)據(jù)結(jié)構(gòu) ——— 并查集

合并集合找根結(jié)點的原因:

  1. 如果這兩個元素所在集合的根結(jié)點相同,說明這兩個元素本身就在同一個集合,無需合并。
  2. 合并集合后需要更新這兩個集合的根結(jié)點的值。

而要判斷兩個元素是否在同一個集合,也就是判斷這兩個元素所在集合的根結(jié)點是否相同。

并查集的實現(xiàn)

并查集的實現(xiàn)

實現(xiàn)并查集時通常會實現(xiàn)如下接口:

  • 初始化并查集。
  • 查找元素所在的集合。
  • 判斷兩個元素是否在同一個集合。
  • 合并兩個元素所在的集合。
  • 獲取并查集中集合的個數(shù)。

代碼如下:

//并查集
class UnionFindSet {
public:
	//構(gòu)造函數(shù)
	UnionFindSet(int n);
	//查找元素所在的集合
	int findRoot(int x);
	//判斷兩個元素是否在同一個集合
	bool inSameSet(int x1, int x2);
	//合并兩個元素所在的集合
	bool unionSet(int x1, int x2);
	//獲取并查集中集合的個數(shù)
	int getNum();
private:
	vector<int> _ufs; //維護(hù)各個結(jié)點之間的關(guān)系
};

并查集中的數(shù)組:

  • 數(shù)組的下標(biāo)依次對應(yīng)每個元素的編號。
  • 數(shù)組中元素值為負(fù)數(shù),表示下標(biāo)編號元素為根結(jié)點,負(fù)數(shù)的絕對值表示該集合中元素的個數(shù)。
  • 數(shù)組中元素值為非負(fù)數(shù),表示下標(biāo)編號元素的父結(jié)點的編號。

并查集的初始化

并查集的初始化

并查集中會用一個數(shù)組來維護(hù)各個結(jié)點之間的關(guān)系,在初始化并查集時,根據(jù)元素的個數(shù)開辟數(shù)組空間,并將數(shù)組中的元素初始化為-1即可。

代碼如下:

//構(gòu)造函數(shù)
UnionFindSet(int n)
	:_ufs(n, -1) //初始時各個元素自成一個集合
{}

查找元素所在的集合

查找元素所在的集合

查找元素所在的集合,本質(zhì)就是查找元素所在集合的根結(jié)點。

查找邏輯如下:

  • 如果元素對應(yīng)下標(biāo)位置存儲的是負(fù)數(shù),則說明該元素即為根結(jié)點,返回該元素即可。
  • 如果元素對應(yīng)下標(biāo)位置存儲的是非負(fù)數(shù),則跳轉(zhuǎn)到其父結(jié)點的位置繼續(xù)查找根結(jié)點。

迭代方式實現(xiàn)如下:

//查找元素所在集合的根結(jié)點(迭代)
int findRoot(int x) {
	int parent = x; //默認(rèn)當(dāng)前結(jié)點就是根結(jié)點
	while (_ufs[parent] >= 0) { //當(dāng)前結(jié)點值不是負(fù)數(shù)則繼續(xù)向上找
		parent = _ufs[parent];
	}
	return parent; //返回根結(jié)點
}

遞歸方式實現(xiàn)如下:

//查找元素所在集合的根結(jié)點(遞歸)
int findRoot(int x) {
	return _ufs[x] < 0 ? x : findRoot(_ufs[x]);
}

判斷兩個元素是否在同一個集合

判斷兩個元素是否在同一個集合

要判斷兩個元素是否在同一個集合,本質(zhì)就是判斷這兩個元素所在集合的根結(jié)點是否相同。

代碼如下:

//判斷兩個元素是否在同一個集合
bool inSameSet(int x1, int x2) {
	return findRoot(x1) == findRoot(x2);
}

合并兩個元素所在的集合

合并兩個元素所在的集合

合并邏輯如下:

  1. 分別找到兩個元素所在集合的根結(jié)點。
  2. 如果這兩個元素所在集合的根結(jié)點相同,則無需合并,如果這兩個元素所在集合的根結(jié)點不同,則將小集合合并到大集合上。
  3. 將小集合根結(jié)點的值累加到大集合的根結(jié)點上,使得大集合根結(jié)點的值的絕對值等于兩個集合中元素的總數(shù)。
  4. 將小集合根結(jié)點的值改為大集合根結(jié)點的編號,也就是讓小集合的根結(jié)點作為大集合根結(jié)點的孩子,使得兩個集合變?yōu)橐粋€集合。

代碼如下:

//合并兩個元素所在的集合
bool unionSet(int x1, int x2) {
	int parent1 = findRoot(x1), parent2 = findRoot(x2); //分別找到兩個元素所在集合的根結(jié)點
	if (parent1 == parent2) //兩個結(jié)點已經(jīng)位于同一集合
		return false;
	if (_ufs[parent1] > _ufs[parent2]) //讓parent1標(biāo)記大集合根結(jié)點,parent2標(biāo)記小集合根結(jié)點
		swap(parent1, parent2);
	//將小集合合并到大集合上
	_ufs[parent1] += _ufs[parent2]; //將小集合根結(jié)點的值累加到大集合的根結(jié)點上
	_ufs[parent2] = parent1; //將小集合根結(jié)點的值改為大集合根結(jié)點的編號
	return true;
}

說明一下:

  • 當(dāng)兩個集合需要合并時,盡量將小集合合并到大集合上,因為被合并的那個集合中的所有結(jié)點在合并后層數(shù)都會加一,所以這樣做的目的就是為了讓較少的結(jié)點層數(shù)加一,該操作不是必須的。

獲取并查集中集合的個數(shù)

獲取并查集中集合的個數(shù)

要獲取并查集中集合的個數(shù),本質(zhì)就是統(tǒng)計數(shù)組中負(fù)值(根結(jié)點)的個數(shù)。

代碼如下:

//獲取并查集中集合的個數(shù)
int getNum() {
	int count = 0; //統(tǒng)計根結(jié)點的個數(shù)
	for (const int& val : _ufs) {
		if (val < 0) //元素值為負(fù)數(shù)則為根結(jié)點
			count++;
	}
	return count; //返回根結(jié)點的個數(shù)
}

并查集的路徑壓縮

并查集的路徑壓縮

當(dāng)數(shù)據(jù)量很大的時候,并查集中樹的層數(shù)可能會變得很高,這時在查找一個元素所在集合的根結(jié)點時就需要往上走很多層,這時可以考慮進(jìn)行路徑壓縮。

  • 路徑壓縮一般會在查找根結(jié)點時進(jìn)行,當(dāng)根據(jù)一個結(jié)點查找其根結(jié)點時,該路徑上所有的結(jié)點都會被壓縮,最終這些結(jié)點會直接被掛在根結(jié)點下,下次再根據(jù)這些結(jié)點查找根結(jié)點時就能快速找到根結(jié)點。

迭代方式實現(xiàn)如下:

//查找元素所在集合的根結(jié)點(迭代)
int findRoot(int x) {
	int root = x; //默認(rèn)當(dāng)前結(jié)點就是根結(jié)點
	while (_ufs[root] >= 0) { //當(dāng)前結(jié)點值不是負(fù)數(shù)則繼續(xù)向上找
		root = _ufs[root];
	}
	//路徑壓縮
	while (_ufs[x] >= 0) { //遍歷從根結(jié)點到x結(jié)點路徑上的所有結(jié)點
		int parent = _ufs[x];
		_ufs[x] = root; //將結(jié)點的父親改為根結(jié)點
		x = parent;
	}
	return root; //返回根結(jié)點
}

遞歸方式實現(xiàn)如下:

//查找元素所在集合的根結(jié)點(遞歸)
int findRoot(int x) {
	int parent = x; //默認(rèn)當(dāng)前結(jié)點就是根結(jié)點
	if (_ufs[x] >= 0) { //當(dāng)前結(jié)點值不是負(fù)數(shù)則繼續(xù)向上找
		parent = findRoot(_ufs[x]); //找到根結(jié)點
		_ufs[x] = parent; //將當(dāng)前結(jié)點的父親改為根結(jié)點(路徑壓縮)
	}
	return parent; //返回根結(jié)點
}

元素的編號問題

元素編號問題

上面在實現(xiàn)并查集時,默認(rèn)元素的編號都是從0開始依次遞增的,但用戶所給的編號可能并不是從0開始的,也不是連續(xù)的,甚至可能不是數(shù)字。

這時可以以模板的方式來實現(xiàn)并查集:

  • 在初始化并查集時,根據(jù)所給元素建立元素與數(shù)組下標(biāo)之間的映射關(guān)系。
  • 在查找元素所在集合的根結(jié)點時,先根據(jù)所給元素得到其對應(yīng)的數(shù)組下標(biāo),然后再進(jìn)行查找。

代碼如下:

//并查集
template<class T>
class UnionFindSet {
public:
	//構(gòu)造函數(shù)
	UnionFindSet(const vector<T>& v)
		:_ufs(v.size(), -1) //初始時各個元素自成一個集合
	{
		//建立元素與數(shù)組下標(biāo)之間的映射關(guān)系
		for (int i = 0; i < v.size(); i++) {
			_indexMap[v[i]] = i;
		}
	}
	//查找元素所在集合的根結(jié)點(迭代)
	int findRoot(const T& x) {
		int parent = _indexMap[x]; //默認(rèn)當(dāng)前結(jié)點就是根結(jié)點
		while (_ufs[parent] >= 0) { //當(dāng)前結(jié)點值不是負(fù)數(shù)則繼續(xù)向上找
			parent = _ufs[parent];
		}
		return parent; //返回根結(jié)點
	}
	//合并兩個元素所在的集合
	bool unionSet(const T& x1, const T& x2) {
		int parent1 = findRoot(x1), parent2 = findRoot(x2); //分別找到兩個元素所在集合的根結(jié)點
		if (parent1 == parent2) //兩個結(jié)點已經(jīng)位于同一集合
			return false;
		if (_ufs[parent1] > _ufs[parent2]) //讓parent1標(biāo)記大集合根結(jié)點,parent2標(biāo)記小集合根結(jié)點
			swap(parent1, parent2);
		//將小集合合并到大集合上
		_ufs[parent1] += _ufs[parent2]; //將小集合根結(jié)點的值累加到大集合的根結(jié)點上
		_ufs[parent2] = parent1; //將小集合根結(jié)點的值改為大集合根結(jié)點的編號
		return true;
	}
	//獲取并查集中集合的個數(shù)
	int getNum() {
		int count = 0; //統(tǒng)計根結(jié)點的個數(shù)
		for (const int& val : _ufs) {
			if (val < 0) //元素值為負(fù)數(shù)則為根結(jié)點
				count++;
		}
		return count; //返回根結(jié)點的個數(shù)
	}
private:
	vector<int> _ufs; //維護(hù)各個結(jié)點之間的關(guān)系
	unordered_map<T, int> _indexMap; //建立元素與數(shù)組下標(biāo)之間的映射關(guān)系
};

這樣在使用并查集時就可以傳入任意類型的元素了。如下:

int main() {
	vector<string> v = { "張三", "李四", "王五", "趙六", "田七", "周八", "吳九" };
	UnionFindSet<string> ufs(v);
	cout << ufs.getNum() << endl; //7
	
	ufs.unionSet("張三", "李四");
	ufs.unionSet("王五", "趙六");
	cout << ufs.getNum() << endl; //5
	
	ufs.unionSet("張三", "趙六");
	cout << ufs.getNum() << endl; //4

	return 0;
}

并查集的題目

省份的數(shù)量

省份的數(shù)量

題目描述:

??有 n n n 個城市,其中一些彼此相連,另一些沒有相連,如果城市 a a a 與城市 b b b 直接相連,且城市 b b b 與城市 c c c 直接相連,那么城市 a a a 與城市 c c c 間接相連。省份是一組直接或間接相連的城市,組內(nèi)不含其他沒有相連的城市。
??給你一個 n × n n \times n n×n 的矩陣,其中 i s C o n n e c t e d [ i ] [ j ] = 1 isConnected[i][j]=1 isConnected[i][j]=1 表示第 i i i 個城市和第 j j j 個城市直接相連,而 i s C o n n e c t e d [ i ] [ j ] = 0 isConnected[i][j]=0 isConnected[i][j]=0 表示二者不直接相連。返回矩陣中省份的數(shù)量。

解題步驟:

  1. 定義一個長度為 n n n 的數(shù)組充當(dāng)并查集,并將數(shù)組中的元素初始化為-1,表示各個城市各自是一個省份。
  2. 根據(jù)所給矩陣,對并查集中的各個集合進(jìn)行合并。
  3. 并查集中集合的個數(shù)即為省份的數(shù)量。

代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-438888.html

class Solution {
public:
    int findCircleNum(vector<vector<int>>& isConnected) {
        //1、初始化并查集
        int n = isConnected.size();
        vector<int> ufs(n, -1);
        auto findRoot = [&ufs](int x)->int {
            int parent = x;
            while (ufs[parent] >= 0) {
                parent = ufs[parent];
            }
            return parent;
        };
        //2、根據(jù)所給矩陣合并集合
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (isConnected[i][j] == 1) { //城市相連
                    int parent1 = findRoot(i), parent2 = findRoot(j);
                    if (parent1 != parent2) { //需要合并
                        ufs[parent2] = parent1;
                    }
                }
            }
        }
        //3、統(tǒng)計并查集中集合的個數(shù)
        int count = 0;
        for (const int& e : ufs) {
            if (e < 0)
                count++;
        }
        return count;
    }
};

說明一下:

  • 在使用并查集解題時不需要實現(xiàn)一個完整的并查集,根據(jù)題目要求實現(xiàn)需要用到的邏輯即可。

等式方程的可滿足性

等式方程的可滿足性

題目描述:

??給定一個由表示變量之間關(guān)系的字符串方程組成的數(shù)組,每個字符串方程 e q u a t i o n s [ i ] equations[i] equations[i] 的長度為4,并采用兩種不同的形式之一:“ a a a== b b b” 或 “ a a a!= b b b”。在這里 a a a b b b 是小寫字母(不一定不同),表示單字母變量名。
??只有當(dāng)可以將整數(shù)分配給變量名,以便滿足所有給定的方程時才返回 t r u e true true ,否則返回 f a l s e false false 。

解題步驟:

  1. 定義一個長度為26(變量為小寫字母)的數(shù)組充當(dāng)并查集,并將數(shù)組中的元素初始化為-1,表示各個字母只有自己等于自己。
  2. 根據(jù)字符串方程組中的等式,對并查集中的各個集合進(jìn)行合并(每個集合中的元素都是相等的)。
  3. 根據(jù)并查集,對字符串方程組中的不等式進(jìn)行驗證,如果兩個不相等的變量出現(xiàn)在同一個集合中,則返回 f a l s e false false 。

代碼如下:

class Solution {
public:
    bool equationsPossible(vector<string>& equations) {
        //1、初始化并查集
        vector<int> ufs(26, -1);
        auto findRoot = [&ufs](int x)->int {
            int parent = x;
            while (ufs[parent] >= 0) {
                parent = ufs[parent];
            }
            return parent;
        };
        //2、根據(jù)字符串方程組中的等式合并集合
        for (const string& s : equations) {
            if (s[1] == '=') { //等式
                int parent1 = findRoot(s[0] - 'a'), parent2 = findRoot(s[3] - 'a');
                if (parent1 != parent2) { //需要合并
                    ufs[parent2] = parent1;
                }
            }
        }
        //3、根據(jù)并查集驗證字符串方程組中的不等式
        for (const string& s : equations) {
            if (s[1] == '!') { //不等式
                int parent1 = findRoot(s[0] - 'a'), parent2 = findRoot(s[3] - 'a');
                if (parent1 == parent2) { //在同一個集合
                    return false;
                }
            }
        }
        return true;
    }
};

到了這里,關(guān)于高階數(shù)據(jù)結(jié)構(gòu) ——— 并查集的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)--并查集

    數(shù)據(jù)結(jié)構(gòu)--并查集

    所有元素的全集s 將各個元素劃分為若干個互不相交的子集 用一個數(shù)組S[ ]即可表示“集合”關(guān)系 集合的兩個基本操作―— “并” color{red}“并” “ 并 ” 和 “查” color{red}“查” “ 查 ” Find -—“查”操作:確定一個指定元素所屬集合 Union --“并”操作:將兩個不想交的集

    2024年02月15日
    瀏覽(17)
  • 【數(shù)據(jù)結(jié)構(gòu)】并查集

    【數(shù)據(jù)結(jié)構(gòu)】并查集

    并查集是簡單的數(shù)據(jù)結(jié)構(gòu),學(xué)會并查集,為圖打好基礎(chǔ)。 是樹狀的數(shù)據(jù)結(jié)構(gòu),用于處理相交集合的合并與查詢 通常用森林表示,一片森林表示一個集合 并查集一般需要完成 查找元素屬于哪個集合 查看兩個元素是否屬于同一個集合 將兩個集合歸并成一個集合 集合的個數(shù) 假

    2024年02月19日
    瀏覽(17)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】并查集

    【數(shù)據(jù)結(jié)構(gòu)與算法】并查集

    并查集是一個樹形結(jié)構(gòu),所謂的并查,就是 當(dāng)我們有了一個節(jié)點,我們就能知道這個節(jié)點屬于哪個集合 。 舉個例子理解以下:戰(zhàn)國時期有很多國家,它們會互相打仗,那么現(xiàn)在有兩個互相不認(rèn)識的人,如何知道對方是敵是友呢? 現(xiàn)在有一種方法:每個國家都有一個大王,我

    2023年04月15日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu)之并查集

    數(shù)據(jù)結(jié)構(gòu)之并查集

    并查表原理是一種 樹型的數(shù)據(jù)結(jié)構(gòu) ,用于處理一些不相交集合的合并及查詢問題。并查集的思想是用一個數(shù)組表示了整片森林(parent),樹的根節(jié)點唯一標(biāo)識了一個集合,我們只要找到了某個元素的樹根,就能確定它在哪個集合里。這類問題的抽象數(shù)據(jù)類型稱為并查集(uni

    2024年02月12日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu)詳細(xì)筆記——并查集

    集合:將各個元素劃分為若干個互不相交的子集的集合 森林是m(m=0)棵互不相交的樹的集合 優(yōu)化思路:在每次Union操作構(gòu)建樹的時候,盡可能讓樹不長高 ①用根結(jié)點的絕對值表示樹的結(jié)點的總數(shù) ②Union操作,讓小樹合并到大樹 優(yōu)化思路:先找到根結(jié)點,再將查找路徑上所有結(jié)

    2024年02月06日
    瀏覽(16)
  • 算法與數(shù)據(jù)結(jié)構(gòu)(九)--并查集

    算法與數(shù)據(jù)結(jié)構(gòu)(九)--并查集

    1.處理對象:Disjoint Set,即“不相交集合”。 在一些應(yīng)用問題中,需將n個不同的元素劃分成一組不相交的集合。開始時,每個元素自成一個單元素集合,然后按一定順序?qū)儆谕唤M元素的集合合并。其間要反復(fù)用到查詢某個元素屬于哪個集合的運算。適合于描述這類問題的

    2024年02月10日
    瀏覽(29)
  • 【數(shù)據(jù)結(jié)構(gòu)】| 并查集及其優(yōu)化實現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】| 并查集及其優(yōu)化實現(xiàn)

    以一個直觀的問題來引入并查集的概念。 親戚問題:有一群人,他們屬于不同家族,同一個家族里的人互為親戚,不同家族的人不是親戚。隨機(jī)指定兩個人,問他們是否有親戚關(guān)系。 以下圖3個不相交的集合表示 3 個家族,當(dāng)詢問兩個人是否有親戚關(guān)系時,也就是問兩個元素

    2024年02月09日
    瀏覽(18)
  • 計算機(jī)基礎(chǔ)--->數(shù)據(jù)結(jié)構(gòu)(9)【并查集】

    計算機(jī)基礎(chǔ)--->數(shù)據(jù)結(jié)構(gòu)(9)【并查集】

    并查集是一種用于解決集合合并和查詢問題的數(shù)據(jù)結(jié)構(gòu),主要用于實現(xiàn)有關(guān)集合的操作,它有兩種主要操作,合并(union)和查找(find)。 查找(Find):用來確定元素屬于哪個集合。它接受一個元素作為參數(shù),并返回這個元素所屬集合的代表元素。通過查找操作,可以判斷

    2024年02月15日
    瀏覽(30)
  • 數(shù)據(jù)結(jié)構(gòu)(八):并查集詳解 (多圖+動圖)

    數(shù)據(jù)結(jié)構(gòu)(八):并查集詳解 (多圖+動圖)

    目錄 一、什么是并查集 二、并查集的存儲結(jié)構(gòu) 三、并查集的基本操作 (一)初始化 (二)Find操作 (三)Union操作 四、并查集的優(yōu)化 (一)Union操作優(yōu)化(小樹并入大樹) (二)Find操作優(yōu)化(壓縮路徑) ????????并查集的邏輯結(jié)構(gòu)是一個包含N個元素的 集合 ,如圖:

    2024年02月03日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu)--并查集的進(jìn)一步優(yōu)化

    數(shù)據(jù)結(jié)構(gòu)--并查集的進(jìn)一步優(yōu)化

    壓縮路徑 ? ? F i n d 操作,先找到根節(jié)點,再將查找路徑上所有結(jié)點都掛到根結(jié)點下 color{red}壓縮路徑 -- Find操作,先找到根節(jié)點,再將查找路徑上所有結(jié)點都掛到根結(jié)點下 壓縮路徑 ? ? F in d 操作,先找到根節(jié)點,再將查找路徑上所有結(jié)點都掛到根結(jié)點下 每次Find操作,

    2024年02月15日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包