Union-find

Union-Find 主要用於解決圖論中的「動態連通性」問題。Union-Find 能夠以近乎線性的時間複雜度處理大量的合併以及查詢操作,並且在許多實際的應用中,例如最小生成樹、連通分量等問題上都有廣泛的應用。

Union-Find資料結構包含兩個主要的操作:

  • Find:查詢元素屬於哪一個子集,可以被用來確定兩個元素是否屬於同一子集。
  • Union:將兩個子集合併成同一個集合。

Union-Find 資料結構的基礎是使用一個數組來保存每個元素的父節點信息。初始化時,每個元素的父節點是其自身。然後,在每次進行 Union 操作時,選擇其中一個集合的根節點(可以透過 Find 操作找到)作為另一個集合的父節點。

在 Union-Find 結構中,可以通過樹的”rank”(樹的深度)來優化合併的過程。將”rank”較小的樹合併到”rank”較大的樹中,這樣可以確保每次合併後樹的”rank”不變或者增加1,這也就保證了Find操作的高效性。

兩個元素是否在同一個集合中,只需要比較這兩個元素的根節點是否相同即可,root 同樣的話就是一個連在一起的tree。

Union-Find 可以用來記錄有多少個獨立的集合。只需記錄根節點的數量,每當一次新的合併操作不增加新的根節點時,根節點數量就減少1,最終剩下的根節點數量就是獨立的集合數量。

root 若不一樣就把兩個parent和在一起,比較大(深度較深的)顆 rank(兩個root的rank )比較高的就當parent
如果rank1>rank2 (高度是5 rank是4)就把 rank1的parent當parent。

用root的數量去記有幾個獨立的tree,有三個root就代表有三個獨立的tree。

200. Number of Islands

947. Most Stones Removed with Same Row or Column

778. Swim in Rising Water

305. Number of Islands II