[英]How do path compression and union by rank complement each other?
我一直在閱讀有關聯合查找問題的信息。 兩個主要的改進是路徑壓縮和按等級聯合。 據我了解,按等級聯合用於確定如何組合不相交的樹。 如果我們有兩個不相交的樹 T1 和 T2,那么我們將具有較小秩的樹的根附加到具有較高秩的樹上。 如果我們不使用路徑壓縮,那么等級就是樹的深度。 這是有道理的,因為我們不想增加輸出樹的深度,因為它直接影響發現和聯合。
我的問題是當我們也使用路徑壓縮時。 我一直讀到這兩種優化相互補充,但我沒有看到。 由於路徑壓縮,秩不再是樹的深度(它成為深度的上限)。 假設 T1 有 2 個分支(令 T1 的秩為 3),T2 的深度為 2,秩為 2。現在假設我們對下面標有“*”的 T1 的葉子執行查找操作(帶有路徑壓縮)。 現在,如果我們聯合 T1 的根和 T2 的根,那么 T2 將附加到 T1 的根上(因為 rank 沒有被 find 更新)。 結果樹的深度為 3。但是如果我們將 T1 附加到 T2,我們可以獲得更好的性能。
T1: o (Rank = 3) T2: o (Rank = 2)
/ \ |
o o o
| |
o o
|
*
在 T1("*") 的葉子上找到后,然后在 T1 和 T2 的根上並集我們得到
T1: o (Rank = 3) T2: o (Rank = 2)
/| |\ |
* o o o o
|
o
Result of T1 union T2
o
/ | | |\
* o o o o Rank = 3 and Max Depth = 3
|
o
|
o
我在這里錯過了什么嗎? 路徑壓縮和按秩聯合如何相互補充? 我知道等級只是樹深度的上限,但我沒有看到按等級聯合如何提高結構的整體性能。 這比隨機組合根的聯合如何更好?
我在這里先向您的幫助表示感謝。
Union by rank 確保樹的最大深度為 log N,因此它在每個操作上都設置了 O(log N) 的最壞情況上限。
沒有任何特殊聯合的路徑壓縮規定每個操作的攤銷成本的上限為 O(log N),但不限制最壞情況成本。 (甚至可能對攤銷成本有更嚴格的限制,但 O(log N) 是我知道如何證明的)
將兩者結合使用,在最壞情況下得到 O(log N) 限制,並且攤銷界限改進為 O(𝛼(N)),這實際上是常數。 通過這種方式,這兩種優化是互補的。
您是對的,有些操作序列按等級聯合並不是絕對最優的,但保證比沒有它時得到的要好,這才是最重要的。 我們通常不會花費精力優化最佳案例性能。 我們優化最壞或平均情況。
如果您按等級/權重使用聯合,則問題中的圖 T2 無法首先形成。
只需自己嘗試使用 3 個節點,看看是否可以得出圖 T2。 這是不可能的。 甚至連圖 T1 也不能一開始就形成。
您可以從 N 個節點的示例開始,如果您從一開始就按等級/權重進行聯合,您實際上會看到它將提供最佳合並結構(某些操作序列可能不會提供最佳合並,但大多數次它給出了最好的結果)。
換句話說,按等級/權重合並有助於查找方法(反過來使用路徑壓縮進行進一步優化),這使得查找操作幾乎是恆定時間操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.