close
*什麼是Union Set?
根據電腦辭典的注釋來翻,Union Set稱為「併集」或是「和集」,簡體中文則譯為「并查集」,總之呢,他是用到「聯集」的概念(事實上Union Set好像就是聯集的英文),也就是把有關係的元素圈在一起。比如說,A跟B是朋友,B跟C是朋友,那A跟C也是朋友,他們三個就可以綑成一個朋友圈。

*處理的概念
Union Set用到了Tree的概念。基本上,如果要看兩個人是不是有關係,那麼只要追本溯源地回到它們的root(根)的那一層,看看兩者的根是不是相同,就可以知道他們有沒有關係了。
如果用樹來表示,可以想成樹狀圖的族譜,一個家族分成許多枝節的後代,在回溯回去他們的始祖時就會發現他們都是來自同樣的祖先,那樣就是有關係了。
*實際的操作
雖然用到了樹的概念,Union Set卻可以很單純地用一個一維陣列來處理。
也就是存一個一維陣列,記錄每個元素的root。
當告訴你兩個元素有關係時,就要先追本溯源地看看他們本來有沒有關係,如果發現他們的root不同的話,那就要把其中一個移枝到另外一個,也就是將其中的一個元素的root改成另一個元素的root。
至於追本溯源,基本上可以使用遞回操作之。如果是單純的處理也可以用迴圈,然而,使用遞回的話,我們可以一邊追本溯源,一邊把樹的深度降低,也就是本來可能在紀錄時,A的root是B,而B的root是C,如果使用遞迴,就可以在找到最上面的root時,將這個root回傳,然後把一路指上去到這個root的元素們的root都改成現在找到的最上面的這個root,這樣紀錄的陣列就會變成只要找一層就可以找到他的始祖,而不用一路一個個的找上去。
*簡單的例題
ACM Q793 Newwork Connections
  c時使用union set把有關聯的電腦接在一起,而q時就追本溯源地看兩者的最上層root是否相同
ACM Q10583
  用union set把人們捆在一起後,再一次掃過去看看有哪些是元素是根,即是一類。
ACM Q10608
  把人們捆在一起後,再全部跑一次,邊跑可以邊計算、邊降深度,以及邊找最大值。

深入應用以後再加′▽`)
arrow
arrow
    全站熱搜

    aikosenoo 發表在 痞客邦 留言(0) 人氣()