




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第java數(shù)據(jù)結(jié)構(gòu)并查集詳解if(v0||vparents.length)
thrownewIllegalArgumentException("visoutofcapacity");
}
2.1QuickFind實(shí)現(xiàn)
以QuickFind實(shí)現(xiàn)的并查集,樹的高度最高為2,每個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)就是根節(jié)點(diǎn)
publicclassUnionFind_QFextendsUnionFind{
publicUnionFind_QF(intcapacity){
super(capacity);
//查
@Override
publicintfind(intv){
rangeCheck(v);
returnparents[v];
//并將v1所在集合并到v2所在集合上
@Override
publicvoidunion(intv1,intv2){
//查找v1v2的父(根)節(jié)點(diǎn)
intp1=find(v1);
intp2=find(v2);
if(p1==p2)return;
//將所有以v1的根節(jié)點(diǎn)為根節(jié)點(diǎn)的元素全部并到v2所在集合上即父節(jié)點(diǎn)改為v2的父節(jié)點(diǎn)
for(inti=0;iparents.length;i++){
if(parents[i]==p1){
parents[i]=p2;
}
2.2QuickUnion實(shí)現(xiàn)
publicclassUnionFind_QUextendsUnionFind{
publicUnionFind_QU(intcapacity){
super(capacity);
//查某一個(gè)元素的根節(jié)點(diǎn)
@Override
publicintfind(intv){
//檢查下標(biāo)是否越界
rangeCheck(v);
//一直循環(huán)查找節(jié)點(diǎn)的根節(jié)點(diǎn)
while(v!=parents[v]){
v=parents[v];
returnv;
//V1并到v2中
@Override
publicvoidunion(intv1,intv2){
intp1=find(v1);
intp2=find(v2);
if(p1==p2)return;
//將v1根節(jié)點(diǎn)的父節(jié)點(diǎn)修改為v2的根結(jié)點(diǎn)完成合并
parents[p1]=p2;
}
三、優(yōu)化
并查集常用快并來實(shí)現(xiàn),但是快并有時(shí)會(huì)出現(xiàn)樹不平衡的情況
有兩種優(yōu)化思路:rank優(yōu)化,size優(yōu)化
3.1基于size的優(yōu)化
核心思想:元素少的樹嫁接到元素多的樹
publicclassUniondFind_QU_SextendsUnionFind{
//創(chuàng)建sizes數(shù)組記錄以元素(下標(biāo))為根結(jié)點(diǎn)的元素(節(jié)點(diǎn))個(gè)數(shù)
privateint[]sizes;
publicUniondFind_QU_S(intcapacity){
super(capacity);
sizes=newint[capacity];
//初始都為1
for(inti=0;isizes.length;i++){
sizes[i]=1;
@Override
publicintfind(intv){
rangeCheck(v);
while(v!=parents[v]){
v=parents[v];
returnv;
@Override
publicvoidunion(intv1,intv2){
intp1=find(v1);
intp2=find(v2);
if(p1==p2)return;
//如果以p1為根結(jié)點(diǎn)的元素個(gè)數(shù)小于以p2為根結(jié)點(diǎn)的元素個(gè)數(shù)p1并到p2上,并且更新p2為根結(jié)點(diǎn)的元素個(gè)數(shù)
if(sizes[p1]sizes[p2]){
parents[p1]=p2;
sizes[p2]+=sizes[p1];
//反之則p2并到p1上,更新p1為根結(jié)點(diǎn)的元素個(gè)數(shù)
}else{
parents[p2]=p1;
sizes[p1]+=sizes[p2];
}
基于size優(yōu)化還有可能會(huì)導(dǎo)致樹不平衡
3.2基于rank優(yōu)化
核心思想:矮的樹嫁接到高的樹
publicclassUnionFind_QU_RextendsUnionFind_QU{
//創(chuàng)建rank數(shù)組ranks[i]代表以i為根節(jié)點(diǎn)的樹的高度
privateint[]ranks;
publicUnionFind_QU_R(intcapacity){
super(capacity);
ranks=newint[capacity];
for(inti=0;iranks.length;i++){
ranks[i]=1;
publicvoidunion(intv1,intv2){
intp1=find(v1);
intp2=find(v2);
if(p1==p2)return;
//p1并到p2上p2為根樹的高度不變
if(ranks[p1]ranks[p2]){
parents[p1]=p2;
//p2并到p1上p1為根樹的高度不變
}elseif(ranks[p1]ranks[p2]){
parents[p2]=p1;
}else{
//高度相同p1并到p2上,p2為根樹的高度+1
parents[p1]=p2;
ranks[p2]+=1;
}
基于rank優(yōu)化,隨著Union次數(shù)的增多,樹的高度依然會(huì)越來越高
導(dǎo)致find操作變慢
有三種思路可以繼續(xù)優(yōu)化:路徑壓縮、路徑分裂、路徑減半
3.2.1路徑壓縮(PathCompression)
在find時(shí)使路徑上的所有節(jié)點(diǎn)都指向根節(jié)點(diǎn),從而降低樹的高度
*QuickUnion-基于rank的優(yōu)化-路徑壓縮
publicclassUnionFind_QU_R_PCextendsUnionFind_QU_R{
publicUnionFind_QU_R_PC(intcapacity){
super(capacity);
@Override
publicintfind(intv){
rangeCheck(v);
if(parents[v]!=v){
//遞歸使得從當(dāng)前v到根節(jié)點(diǎn)之間的所有節(jié)點(diǎn)的父節(jié)點(diǎn)都改為根節(jié)點(diǎn)
parents[v]=find(parents[v]);
returnparents[v];
}
雖然能降低樹的高度,但是實(shí)現(xiàn)成本稍高
3.2.2路徑分裂(PathSpliting)
使路徑上的每個(gè)節(jié)點(diǎn)都指向其祖父節(jié)點(diǎn)
*QuickUnion-基于rank的優(yōu)化-路徑分裂
publicclassUnionFind_QU_R_PSextendsUnionFind_QU_R{
publicUnionFind_QU_R_PS(intcapacity){
super(capacity);
@Override
publicintfind(intv){
rangeCheck(v);
while(v!=parents[v]){
intp=parents[v];
parents[v]=parents[parents[v]];
v=p;
returnv;
}
3.2.3路徑減半(Path
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐飲普法考試試題及答案
- 黑龍江2025自考計(jì)算機(jī)科學(xué)數(shù)據(jù)結(jié)構(gòu)選擇題專練
- 河南2025自考英語(yǔ)馬克思概論客觀題專練
- 全民健身中心建設(shè)工程經(jīng)濟(jì)效益和社會(huì)效益分析報(bào)告
- 甘肅2025自考學(xué)前教育原理易錯(cuò)題專練
- 期貨風(fēng)險(xiǎn)測(cè)試題及答案
- 寧夏2025自考學(xué)前教育學(xué)前兒童家庭教育案例題專練
- 重慶2025自考區(qū)域國(guó)別學(xué)歐洲聯(lián)盟概論簡(jiǎn)答題專練
- 甘肅2025自考護(hù)理學(xué)內(nèi)科護(hù)理學(xué)二主觀題專練
- 模塊化制冷技術(shù)-洞察與解讀
- 2025四川數(shù)據(jù)集團(tuán)有限公司第二批員工招聘3人筆試歷年參考題庫(kù)附帶答案詳解
- 2025年甘肅省天水市供熱有限公司招聘12人筆試歷年參考題庫(kù)附帶答案詳解
- 2025年一卷政治高考真題及答案
- 廚房火災(zāi)安全培訓(xùn)教材課件
- DB15∕T 3843-2025 新能源分布式電源并網(wǎng)技術(shù)規(guī)范
- 《鋰電池的制造工藝》課件
- 海上風(fēng)電場(chǎng)安全監(jiān)測(cè)技術(shù)的現(xiàn)狀與未來發(fā)展趨勢(shì)
- 足浴前臺(tái)禮儀培訓(xùn)課件
- 2025年幼兒園中、高級(jí)教師職稱考試(綜合素質(zhì))歷年參考題庫(kù)含答案詳解(5卷)
- 2024人教版七年級(jí)生物下冊(cè)期末復(fù)習(xí)全冊(cè)考點(diǎn)背誦提綱
- 生物力學(xué)正畸方案優(yōu)化-洞察及研究
評(píng)論
0/150
提交評(píng)論