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

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

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

并查集是簡單的數(shù)據(jù)結(jié)構(gòu),學(xué)會并查集,為圖打好基礎(chǔ)。

并查集的概念

是樹狀的數(shù)據(jù)結(jié)構(gòu),用于處理相交集合的合并與查詢

通常用森林表示,一片森林表示一個集合

并查集一般需要完成

  1. 查找元素屬于哪個集合
  2. 查看兩個元素是否屬于同一個集合
  3. 將兩個集合歸并成一個集合
  4. 集合的個數(shù)

并查集的原理 ?

假設(shè)有10個人,用集合表示為{0,1,2,3,4,5,6,7,8,9}

我們用數(shù)組表示這十個人

  1. 數(shù)組的下標(biāo)表示人的編號
  2. 數(shù)組的內(nèi)容表示每個人認(rèn)識其中人的數(shù)目 (-1 表示只認(rèn)識自己)

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

表示為10片森林

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

經(jīng)過一段時間后,他們形成三個小團(tuán)體,s1{0,6,7,8}? s2{1,4,9} s3{ 2,3,5}

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

利用并查集表示

  • 數(shù)組的下標(biāo)對應(yīng)集合中元素的編號
  • 數(shù)組中如果為負(fù)數(shù),負(fù)號代表根,數(shù)字代表該集合中元素個數(shù)
  • 數(shù)組中如果為非負(fù)數(shù),代表該元素雙親在數(shù)組中的下標(biāo)

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

所以在并查集中,我們會關(guān)注數(shù)組的下標(biāo)和數(shù)組的內(nèi)容。

如果數(shù)組的內(nèi)容是負(fù)數(shù),那么他就是根(Root)

如果數(shù)組的內(nèi)容為(非負(fù)數(shù)),那么就指向他的父親。

所以我們能簡單解決這些問題

  • 查找元素屬于哪個集合

沿著樹形關(guān)系一直往上尋找到根(直到找到內(nèi)容為負(fù)數(shù)的)

  • 查看元素是否屬于同一個集合

尋找到根,不同則表示不是同一個集合

  • 將兩個集合歸并成一個集合

一個集合歸并到另一個集合中,并修改集合的內(nèi)容

  • 集合的個數(shù)

多少個負(fù)數(shù)內(nèi)容的位置,就有多少個集合

接下來,來簡單實現(xiàn)一個并查集


并查集的模擬

框架

//并查集
class UnionFindSet {
public:
	//構(gòu)造函數(shù)
	UnionFindSet(int n);
    
    //查找元素所在的集合
	int findRoot(int x);

	//合并兩個元素所在的集合
	void Union(int x1, int x2)
	
    //獲取并查集中集合的個數(shù)
	int SetCount();
private:
	vector<int> _set;各個結(jié)點之間的關(guān)系
};

構(gòu)造

接收vector容器應(yīng)該預(yù)留的空間

初始化為-1

	UnionFindSet(size_t size)
		:_set(size,-1)
	{}

不需要自定析構(gòu)函數(shù)

默認(rèn)會調(diào)用系統(tǒng)默認(rèn)析構(gòu)


查找root

一直向上尋找,變換x ,直到找到內(nèi)容為負(fù)數(shù)

	//查找元素是否在集合里
	int FindRoot(int x)
	{
		while (_set[x] >= 0)
		{
			x = _set[x];
		}
		return x;
	}

合并倆個集合

將B合并到A中,A的根內(nèi)容要改變,B的根內(nèi)容也要改變

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

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

	//合并
	void Union(int x1, int x2)
	{
		int root1 = FindRoot(x1);
		int root2 = FindRoot(x2);
		if (root1 != root2)
		{
			_set[root1] += _set[root2];
			_set[root2] = root1;	
		}
	}

路徑壓縮

如果有大量的數(shù)據(jù),那么樹的層數(shù)可能非常高,查找的時候就需要一層一層往上迭代。這時候很浪費效率,這里就提出路徑壓縮。

路徑壓縮一般發(fā)送在查找根結(jié)點,會壓縮路徑上的所有結(jié)點,掛接到根上。

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

	int FindRoot(int x)
	{
		//找根
		int root = x;
		while (_set[root ] >= 0)
		{
			root = _set[root ];
		}

		//壓縮
		while (_set[x] >= 0)
		{
			int parent = _set[x];
			_set[x] = root;

			x = parent;
		}
		return root;

	}

Gitee:提取代碼

相關(guān)題目

LCR 116. 省份數(shù)量

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

思路:
運用并查集的相關(guān)知識

題目給我們一個相鄰矩陣,遍歷一半矩陣就能知道連通的關(guān)系。

我們把矩陣中為1的放到一個集合中,返回集合的數(shù)目

解題時,運用lambda表達(dá)式,調(diào)用找根root的函數(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-827951.html

class Solution {
public:
    int findCircleNum(vector<vector<int>>& isConnected) {
        int n=isConnected[0].size();
        vector<int> _ufs(n,-1);
        //找根 >=0 就往上找
        auto FindRoot=[&_ufs](int x)
        {
            int parent=x;
            while(_ufs[parent]>=0)
            {
                parent=_ufs[parent];
            }
            return parent;
        };

        //遍歷,遇到1 并且根不同 就合并 
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<=i;j++)
            {
                if(isConnected[i][j]==1)
                {
                    int root1=FindRoot(i);
                    int root2=FindRoot(j);
                    if(root1!=root2)
                    {
                        _ufs[root1]+=_ufs[root2];
                        _ufs[root2]=root1;
                    }
                }
            }
        }

        int count =0;
        for(auto x:_ufs)
        {
            if(x<0)
                count++;
        }
        return count;

    }
};

到了這里,關(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)---并查集

    這里可以使用生活中的一個例子來帶著大家理解并查集,大家在上學(xué)的過程中肯定會發(fā)現(xiàn)一種現(xiàn)象,在開學(xué)之前大家誰也不認(rèn)識誰每個人都是一個小團(tuán)體,可是開學(xué)之后因為座位旁邊有一個同桌,所以開學(xué)沒多久你和同桌就會互相認(rèn)識并且開心的玩在一起,那么這時就是兩個

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

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

    目錄 一、概念 ?編輯 二、應(yīng)用場景--“連接”問題(屬于同一Qu 三、實現(xiàn)思路 ?四、如何存儲數(shù)據(jù) 五、定義接口 1.初始化(init) 2.其他 isSame() 六、抽象類 六、Quick Find【v1 所在集合的所有元素都指向?v2 的根節(jié)點】 1.Union 1.Union圖解 2.注意點:? 3.代碼實現(xiàn) 2.find? 1.find圖

    2023年04月09日
    瀏覽(22)
  • 數(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)之并查集

    并查表原理是一種 樹型的數(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)】| 并查集及其優(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)
  • Java高階數(shù)據(jù)結(jié)構(gòu) & 并查集 & 最小生成樹

    Java高階數(shù)據(jù)結(jié)構(gòu) & 并查集 & 最小生成樹

    并查集與最小生成樹 1.1 并查集的原理 在一些應(yīng)用問題中,我們常常會遇到一類問題 一開始是一個人 后來新增的人可能與這個人有關(guān)系,也可能與這個人無關(guān)系。 一個人與一個人有關(guān)系,這個人與另一個人也有關(guān)系,那么三人都有關(guān)系。 有關(guān)系的和沒關(guān)系的之間是不同的類

    2024年02月03日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包