日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

并查集小结(转)

發(fā)布時間:2023/12/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并查集小结(转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近做了點(diǎn)并查集的題,感覺也挺簡單的。下面對我這段時間關(guān)于并查集的學(xué)習(xí),做一下小結(jié)。

并查集的作用:并和查,即合并和查找,將一些集合合并,快速查找或判斷某兩個集合的關(guān)系,或某元素與集合的關(guān)系,或某兩個元素的關(guān)系。

并查集的結(jié)構(gòu):并查集主要操作對象是森林,樹的結(jié)構(gòu)賦予它獨(dú)特的能力,對整個集合操作轉(zhuǎn)換為對根節(jié)點(diǎn)(或稱該集合的代表元素)的操作,一個集合里的元素關(guān)系不一定確定,但相對于根節(jié)點(diǎn)的關(guān)系很明了,這也是為了查找方便。

并查集優(yōu)化方法:按秩合并和路徑壓縮的配合使用,使得查找過程優(yōu)化到極致。按秩合并,每次將深度小的樹合并到深度大的樹里面去,使得整棵樹盡量矮;路徑壓縮,將當(dāng)前節(jié)點(diǎn)到根節(jié)點(diǎn)路徑上的所有點(diǎn)直接連到根節(jié)點(diǎn)上,使得每個點(diǎn)到根節(jié)點(diǎn)的距離更短,在下一次查找的時候更快。

如何快速確定偏移量公式:

例:現(xiàn)在要合并節(jié)點(diǎn)x,y, 找到根節(jié)點(diǎn)fx = Find(x); fy = Find(y);一般情況下,根節(jié)點(diǎn)的偏移量都保持為0, offset[foot] = 0;如果要使得x和y的偏移量為t,假設(shè)fx指向fy,則可以寫出公式offset[x] + offset[fx] - offset[y] = t,則offset[fx] = (offset[y] + t - offset[x]) % n; 這個n即為總共有多少類,如:在poj1182 食物鏈中n = 3,,在poj2492 A Bug's Life中n = 2, 這樣fx的偏移量就計(jì)算出來了,只需要改其中一個根節(jié)點(diǎn)的偏移量,這里是fx,因?yàn)榧僭O(shè)是fx指向fy。

非遞歸路勁壓縮:

View Code 1 代碼 2 3 int Find(int x){ 4 int r = x; 5 while (r != bin[r]){ 6 r = bin[r]; 7 } 8 int y = x; 9 while (y != bin[y]){ 10 y = bin[y]; 11 bin[y] = r; 12 } 13 return r; 14 }

遞歸式路徑壓縮:

intFind(intx){
if(x !=bin[x]){
returnbin[x] =Find(bin[x]);
}
returnx;
}

轉(zhuǎn)載于:https://www.cnblogs.com/0803yijia/archive/2012/08/03/2622171.html

總結(jié)

以上是生活随笔為你收集整理的并查集小结(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。