并查集小结(转)
最近做了點(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é)
- 上一篇: C# 破解防盗链
- 下一篇: 大三了,计算机专业学生的困惑。 [转]