普林斯頓大學算法公開課(2)----並查集

  並查集是一種樹型的數據結構,用於處理一些不相交集合(Disjoint Sets)的合併及查詢問題。web

  Dynamic connectivity算法

  (1)Find query,檢查兩個物體是否在一個單元中。數組

  (2)Union command,鏈接2個單元,使得這個單元包含這兩個物體。數據結構

  Quick find:id[p] is p的單元id性能

  (1)Find:p and q索引的id是否相同。ui

  (2)Union:合併p=q,則要合併全部條目的id=id[p],id=id[q]。spa

  Quick Union:id[p] is p的i的父節點orm

  (1)Find:檢查p和q是否有同一個root。htm

  (2)Union:set p的root爲q的root。blog

  Improvement

  (1)Weighted Quick-Union。在進行合併的時候,會首先判斷待合併的兩棵樹的大小即老是size小的樹做爲子樹和size大的樹進行合併。這樣就可以儘可能的保持整棵樹的平衡。

  (2)Weighted Quick-Union With Path Compression。find方法的執行過程當中,不是須要進行一個while循環找到根節點嘛?若是保存全部路過的中間節點到一個數組中,而後在while循環結束以後,將這些中間節點的父節點指向根節點,不就好了麼?可是這個方法也有問題,由於find操做的頻繁性,會形成頻繁生成中間節點數組,相應的分配銷燬的時間天然就上升了。那麼有沒有更好的方法呢?仍是有的,即將節點的父節點指向該節點的爺爺節點,這一點很巧妙,十分方便且有效,至關於在尋找根節點的同時,對路徑進行了壓縮,使整個樹結構扁平化。

  算法性能

  對於Quick-Union算法而言,節點組織的理想狀況應該是一顆十分扁平的樹,全部的孩子節點應該都在height1的地方,即全部的孩子都直接鏈接到根節點。這樣的組織結構可以保證find操做的最高效率。

  動態連通性相關的Union-Find算法基本上就介紹完了,從容易想到的Quick-Find到相對複雜可是更加高效的Quick-Union,而後到對Quick-Union的幾項改進,讓咱們的算法的效率不斷的提升。這幾種算法的時間複雜度以下所示:

Algorithm

Constructor

Union

Find

Quick-Find

N

N

1

Quick-Union

N

Tree height

Tree height

Weighted Quick-Union

N

lgN

lgN

Weighted Quick-Union With Path Compression

N

Very near to 1 (amortized)

Very near to 1 (amortized)

 

相關文章
相關標籤/搜索