1. 程式人生 > ><算法><Union Find並查集>

<算法><Union Find並查集>

添加 容易 fin 程序 zh-cn 過程 表現 應用場景 union

Intro

  • 想象這樣的應用場景:給定一些點,隨著程序輸入,不斷地添加點之間的連通關系(邊),整個圖的連通關系也在變化。這時候我們如何維護整個圖的連通性(即判斷任意兩個點之間的連通性)呢?
  • 一個比較簡單的solution是每個點都有一個便簽,標記它屬於哪個連通子圖。這種做法就有一個很明顯的問題 -- 牽一發而動全身,因為每個節點所屬的組號(標簽)都是單獨記錄,各自為政的,沒有將它們以更好的方式組織起來,當涉及到修改的時候,除了逐一通知、修改,別無他法。所以現在的問題就變成了,如何將節點以更好的方式組織起來,組織的方式有很多種,但是最直觀的還是將組號相同的節點組織在一起,想想所學的數據結構,什麽樣子的數據結構能夠將一些節點給組織起來?常見的就是鏈表,圖,樹,什麽的了。但是哪種結構對於查找和修改的效率最高?毫無疑問是樹,因此考慮如何將節點和組的關系以
    的形式表現出來。

Union Find

  • 采用parent-link的方式將節點組織起來,那麽節點的root就是該組的組號了。
  • 樹這種數據結構容易出現極端情況,因為在建樹的過程中,樹的最終形態嚴重依賴於輸入數據本身的性質,比如數據是否排序,是否隨機分布等等。比如在輸入數據是有序的情況下,構造的BST會退化成一個鏈表
  • 為了解決上述問題,BST可以演變成為紅黑樹或者AVL樹等等。

<算法><Union Find並查集>