並查集路徑壓縮方法

來源:互聯網
上載者:User

       使用並查集尋找時,如果尋找次數很多,那麼使用樸素版的尋找方式肯定要逾時。比如,有一百萬個元素,每次都從第一百萬個開始找,這樣一次運算就是10^6,如果程式要求尋找個一千萬次,這樣下來就是10^13,肯定要出問題的。

  這是樸素尋找的代碼,適合資料量不大的情況:

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結點搜尋到祖先結點所經過的結點都指向該祖先結點
return parent[x];
}

    

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

int find(int x)
{
int k, j, r;
r = x;
while(r != parent[r]) //尋找跟節點
r = parent[r]; //找到跟節點,用r記錄下
k = x;
while(k != r) //非遞迴路徑壓縮操作
{
j = parent[k]; //用j暫存parent[k]的父節點
parent[k] = r; //parent[x]指向跟節點
k = j; //k移到父節點
}
return r; //返回根節點的值
}

   

    如有錯誤,歡迎指正!

    作者:VonGang   

     轉載請註明出處  http://www.cnblogs.com/vongang/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.