免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
【轉(zhuǎn)】并查集路徑壓縮
使用并查集查找時,如果查找次數(shù)很多,那么使用樸素版的查找方式肯定要超時。比如,有一百萬個元素,每次都從第一百萬個開始找,這樣一次運算就是10^6,如果程序要求查找個一千萬次,這樣下來就是10^13,肯定要出問題的。

  這是樸素查找的代碼,適合數(shù)據(jù)量不大的情況:

int findx(int x)
{
int r=x;
while(parent[r] !=r)
r=parent[r];
return r;
}

   

    下面是采用路徑壓縮的方法查找元素:

int find(int x)       //查找x元素所在的集合,回溯時壓縮路徑
{
if (x != parent[x])
{
parent[x] = find(parent[x]); //回溯時的壓縮路徑
} //從x結(jié)點搜索到祖先結(jié)點所經(jīng)過的結(jié)點都指向該祖先結(jié)點
return parent[x];
}

    

    上面是一采用遞歸的方式壓縮路徑, 但是,遞歸壓縮路徑可能會造成溢出棧,我曾經(jīng)因為這個RE了n次,下面我們說一下非遞歸方式進行的路徑壓縮:

int find(int x)
{
int k, j, r;
r = x;
while(r != parent[r]) //查找跟節(jié)點
r = parent[r]; //找到跟節(jié)點,用r記錄下
k = x;
while(k != r) //非遞歸路徑壓縮操作
{
j = parent[k]; //用j暫存parent[k]的父節(jié)點
parent[k] = r; //parent[x]指向跟節(jié)點
k = j; //k移到父節(jié)點
}
return r; //返回根節(jié)點的值
}
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
并查集詳細講解(轉(zhuǎn)載) && 模板
372,二叉樹的最近公共祖先
[leetcode] 樹(Ⅰ)
劍指offer 24 二叉樹中和為某一值的路徑 ★★★★
九種查找算法
圖解:什么是并查集?
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服