最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++并查集常用操作

 更新時間:2021年07月08日 11:27:55   投稿:mrr  
并查集 是一種樹型的數(shù)據(jù)結(jié)構(gòu),用于處理一些不相加集合的合并和查詢問題。本文給大家分享C++并查集常用操作及算法實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧

并查集 是一種樹型的數(shù)據(jù)結(jié)構(gòu),用于處理一些不相加集合的合并和查詢問題。在使用中常常以森林來表示。 并查集也是用來維護(hù)集合的,和前面學(xué)習(xí)的set不同之處在于,并查集能很方便地同時維護(hù)很多集合。如果用set來維護(hù)會非常的麻煩。并查集的核心思想是記錄每個結(jié)點(diǎn)的父親結(jié)點(diǎn)是哪個結(jié)點(diǎn)。

前言

并查集是一種多叉樹,用于處理不相交的集合的合并與查詢問題(判斷)。

通俗理解:在日常生活中,我們會因?yàn)槟硞€人是自己的朋友,哪怕是朋友的朋友也是有朋友,會給予通融、 偏袒。而并查集的基本概念,就是判斷某兩個集合是否是“朋友”關(guān)系,并讓兩個集合成為“朋友”

常用操作

初始化:每個結(jié)點(diǎn)單獨(dú)作為一個集合

查詢:求元素所在的集合的代表元素,即根結(jié)點(diǎn)

合并:將兩個元素所在的集合,合并為一個集合

合并之前,應(yīng)先判斷兩個元素是否屬于同一集合,用上面的“查詢”來實(shí)現(xiàn)

算法實(shí)現(xiàn)

初始化:初始的時候每個結(jié)點(diǎn)各自為一個集合,father[i]表示結(jié)點(diǎn) i 的父親結(jié)點(diǎn),如果 father[i]=i,我們認(rèn)為這個結(jié)點(diǎn)是當(dāng)前集合根結(jié)點(diǎn)(開始時每個節(jié)點(diǎn)根節(jié)點(diǎn)是他自己)。

void init() {

    for (int i = 1; i <= n; ++i) {

        father[i] = i;

    }

}

查找:查找結(jié)點(diǎn)所在集合的根結(jié)點(diǎn),結(jié)點(diǎn) x 的根結(jié)點(diǎn)必然也是其父親結(jié)點(diǎn)的根結(jié)點(diǎn)(像是有遞歸的樣子)。

int get(int x) {

    if (father[x] == x) { // x 結(jié)點(diǎn)就是根結(jié)點(diǎn)

        return x; 

    }

    return get(father[x]); // 如果該節(jié)點(diǎn)不是根節(jié)點(diǎn),繼續(xù)尋找父結(jié)點(diǎn)的根結(jié)點(diǎn)

}

合并:將兩個元素所在的集合合并在一起,通常來說,合并之前先判斷兩個元素是否屬于同一集合。

void hebing(int x, int y) {

    x = find(x);

    y = find(y);

    if (x != y) { // 不在同一個集合

        father[y] = x;//將根節(jié)點(diǎn)合并

    }

}

上面三個操作是并查集常用的操作

前面的并查集的復(fù)雜度實(shí)際上在有些極端情況會很慢。比如樹的結(jié)構(gòu)正好是一條鏈,那么最壞情況下,每次查詢的復(fù)雜度達(dá)到了O(n) 。這并不是我們期望的結(jié)果。路徑壓縮的思想是,我們只關(guān)心每個結(jié)點(diǎn)的父結(jié)點(diǎn),而并不太關(guān)心樹的真正的結(jié)構(gòu)(遞歸查找相當(dāng)浪費(fèi)時間)如下:

當(dāng)想去訪問6的根節(jié)點(diǎn)時,要訪問5的根節(jié)點(diǎn),想去訪問5的根節(jié)點(diǎn),又要去訪問4的根節(jié)點(diǎn)..........以此類推,此時并查集退化為線性。

這樣我們在一次查詢的時候,可以把查詢路徑上的所有結(jié)點(diǎn)的father[i]都賦值成為根結(jié)點(diǎn)。只需要在我們之前的查詢函數(shù)上面進(jìn)行很小的改動

int findf(int k)
{     if(f[k] == k) 
        return k;     
        return f[k] = findf(f[k]); //后來更新的點(diǎn)的根節(jié)點(diǎn)直接為最開始的點(diǎn),一步找到總根節(jié)點(diǎn)。
}

初步學(xué)習(xí)理解,如有不足請指出,謝謝

到此這篇關(guān)于C++并查集基礎(chǔ)的文章就介紹到這了,更多相關(guān)C++并查集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++?多線程之互斥量(mutex)詳解

    C++?多線程之互斥量(mutex)詳解

    這篇文章主要為大家詳細(xì)介紹了C++多線程之互斥量(mutex),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • c語言解析bmp圖片的實(shí)例

    c語言解析bmp圖片的實(shí)例

    下面小編就為大家?guī)硪黄猚語言解析bmp圖片的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • C++?NFS掛載及掛載命令

    C++?NFS掛載及掛載命令

    這篇文章主要介紹了C++?NFS掛載,文中給大家提到了掛載NFS時常用的命令,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • C語言實(shí)現(xiàn)電腦關(guān)機(jī)程序

    C語言實(shí)現(xiàn)電腦關(guān)機(jī)程序

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)電腦關(guān)機(jī)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 深入理解C++內(nèi)鏈接與外鏈接的意義

    深入理解C++內(nèi)鏈接與外鏈接的意義

    鏈接描述了名稱在整個程序或一個翻譯單元中如何引用或不引用同一實(shí)體,下面這篇文章主要給大家介紹了關(guān)于C++內(nèi)鏈接與外鏈接意義的理解,需要的朋友可以參考下
    2021-11-11
  • 聊聊C語言中sizeof運(yùn)算符的一個陷阱

    聊聊C語言中sizeof運(yùn)算符的一個陷阱

    在C語言中,sizeof()是一個判斷數(shù)據(jù)類型或者表達(dá)式長度的運(yùn)算符,下面這篇文章主要給大家介紹了關(guān)于C語言中sizeof運(yùn)算符的一個陷阱的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • C++實(shí)現(xiàn)基于EASYX庫掃描線算法

    C++實(shí)現(xiàn)基于EASYX庫掃描線算法

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)基于EASYX庫掃描線算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++ set和multiset的使用小結(jié)

    C++ set和multiset的使用小結(jié)

    本文介紹了C++中序列式容器和關(guān)聯(lián)式容器的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • C語言雙向鏈表的原理與使用操作

    C語言雙向鏈表的原理與使用操作

    雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數(shù)據(jù)結(jié)點(diǎn)中都有兩個指針,分別指向直接后繼和直接前驅(qū)。本文主要介紹了C語言算法中雙向鏈表的實(shí)現(xiàn),需要的可以參考一下
    2022-05-05
  • C++模板元編程實(shí)現(xiàn)選擇排序

    C++模板元編程實(shí)現(xiàn)選擇排序

    這篇文章主要介紹了C++模板元編程實(shí)現(xiàn)選擇排序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評論

嵩明县| 当雄县| 土默特右旗| 武强县| 亳州市| 乌拉特后旗| 宁强县| 台湾省| 永新县| 南岸区| 绥江县| 囊谦县| 兰州市| 聂拉木县| 增城市| 巫山县| 鹿邑县| 穆棱市| 新疆| 昭觉县| 若尔盖县| 寿宁县| 瑞丽市| 河南省| 白河县| 城口县| 木里| 珲春市| 博乐市| 嘉荫县| 汉川市| 西畴县| 淮南市| 祥云县| 河北区| 灵石县| 浦江县| 乐山市| 镇宁| 邢台县| 班玛县|