左神演算法基礎class5 題目6並查集實現

2021-10-02 12:06:50 字數 3310 閱讀 7319

2.分析

3.完整**

4.執行結果

並查集的作用主要有兩點:

①快速查兩個元素是同一集合

②合併兩個集合。

當集合中只有乙個元素時,這個集合的代表節點即為該元素,該元素的father也是自己。

當乙個集合中有多個節點時,下層節點的father為上層節點,最上層節點的father指向自己,最上層的節點叫做這個集合的代表節點。如下圖5,4的father是3,3的father是其自己。

①查詢:假設查詢a,b是否在同乙個集合,對a,b查詢其代表節點,若他們的代表節點不同則不在同乙個集合,相同在同乙個集合。如下圖,2,5不在同一集合,4,5在同一集合

②合併在兩個集合不是同一集合的情況下,將長度短集合的代表節點的father指到長度長的代表節點上。

並查集使用兩個map實現,第乙個fathermap用來查詢其father元素,key表示當前節點,value是其father節點。第二個sizemap用來記錄其集合的總長度,key表示當前節點,value是其集合的長度。

class

unionfindset

;

建構函式

unionfindset::

unionfindset

(vector<

char

> data)

}}

代表節點的特點是其father節點是自己,整體思路是通過fathermap一步步通過當前節點與其father節點是否相同來找代表節點。

//遞迴版

char unionfindset::

findhead

(char cur)

fathermap[cur]

= father;

//遞迴後father是代表節點,對每個子節點father節點都改為代表節點

return father;

}

//非遞迴版

char unionfindset::

findhead

(char cur)

//執行至此處時,cur是代表節點

while

(!child.

empty()

)return cur;

}

bool unionfindset::

isameset

(char a,

char b)

在兩個代表節點不同的情況下,比較連個集合的長度,短的集合的代表節點指向長的集合,再把兩個集合的總長度加到代表節點上。

注:非代表節點的長度沒有意義,比較時只比較代表節點的總長度。

void unionfindset::

union

(char a,

char b)

else

}}

#include

#include

#include

#include

using

namespace std;

class

unionfindset

;unionfindset::

unionfindset

(vector<

char

> data)}}

//遞迴版

//char unionfindset::findhead(char cur)

//// fathermap[cur] = father; //遞迴後father是代表節點,對每個子節點father節點都改為代表節點

// return father;

//}//非遞迴版

char unionfindset::

findhead

(char cur)

//執行至此處時,cur是代表節點

while

(!child.

empty()

)return cur;

}bool unionfindset::

isameset

(char a,

char b)

void unionfindset::

union

(char a,

char b)

else}}

intmain()

; temp.

push_back

('a');

temp.

push_back

('b');

temp.

push_back

('c');

temp.

push_back

('d');

temp.

push_back

('e');

temp.

push_back

('f');

temp.

push_back

('g');

temp.

push_back

('h');

unionfindset m

(temp)

; m.

union

('b'

,'a');

m.union

('c'

,'b');

m.union

('d'

,'e');

m.union

('b'

,'d');

system

("pause");

return0;

}

將b集合和d集合合併,結果如下圖a,b,c,e指向a,d指向e。

左神演算法基礎class8 題目5母牛產子問題

母牛每年生乙隻母牛,新出生的母牛成長三年後也能每年生乙隻母牛,假設不會死。求n年後,母牛的數量。先列出圖表找規律 可以看出規律 今年生的牛等於去年牛的總和,再加上所有成熟的牛再生乙個 成熟的母牛數量 那麼成熟的牛的數量怎麼知道呢?根據題意實際就是三年前牛的總和 三年前所有的牛完全能保證成熟可以生育,...

js ES6學習筆記 Class(5)

2 es6允許繼承原生建構函式定義子類,因為es6是先新建父類的例項物件this,然後再用子類的建構函式修飾this,使得父類的所有行為都可以繼承。下面是乙個繼承array的例子。class myarray extends array var arr new myarray arr 0 12 arr...

左神演算法基礎class2 例子1荷蘭國旗問題

荷蘭國旗問題 給定乙個陣列arr,和乙個數num,請把小於num的數放在陣列的左邊,等於num的數放在陣列的中間,大於num的數放在陣列的右邊。要求額外空間複雜度o 1 時間複雜度o n 1.把陣列劃分為小於等於num的區域和大於num的區域。用變數x代表小於區域的位置。剛開始由於不存在小於等於的區...