上文中我們已經對**進行了幾次優化,使得進行連線操作的時候,所形成的樹長度盡量短,但同時也存在另一種情況:集合元素多,但是每個元素分別指向根節點,這樣就只有兩層(舉例),那麼就應該把這棵樹的根節點指向另一棵高樹的根節點,就出現了所謂的「集合元素多,但是樹長度短「的情況,因此,應當首先考慮樹的高度,而非樹的元素量。進行如下優化:
class unionfind
else
}};
int find(int p)
注意:遞迴會耗費一定時間,視情況選擇路徑壓縮的程度。此種路徑壓縮完畢後,形成的是一棵高度為2的樹,每個元素指向根節點。相應地,也有一種不太徹底的路徑壓縮方法:
int find(int p){assert(p>=0&&p並查集的時間複雜度近乎為o(1)
路徑壓縮 並查集路徑壓縮
如何描述乙個複雜的連線關係?如圖,很容易判斷緊鄰的2個人關係,但中間的連線很多很亂,怎麼判斷出兩個人的關係呢?並查集就是一種結構,通過儲存節點以及節點上的標籤,來判斷這兩個節點是否連線在一起。當兩個節點繫結時,可以任選其中乙個節點的標籤,指定另乙個節點。當判斷兩個節點是不是連線時,可以上溯節點的祖宗...
並查集 壓縮路徑
並查集 union findsets 一種簡單的用途廣泛的集合.並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數等。最完美的應用當屬 實現kruskar演算法求最小生成樹。並查集的精髓 即它的三種操作,結合實現 模板進行理解 1 make s...
並查集路徑壓縮
使用並查集查詢時,如果查詢次數很多,那麼使用樸素版的查詢方式肯定要超時。比如,有一百萬個元素,每次都從第一百萬個開始找,這樣一次運算就是10 6,如果程式要求查詢個一千萬次,這樣下來就是10 13,肯定要出問題的。這是樸素查詢的 適合資料量不大的情況 int findx int x 下面是採用路徑壓...