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代表小於區域的位置。剛開始由於不存在小於等於的區...