四 union find演算法

2021-07-10 06:59:45 字數 3795 閱讀 6666

問題

問題總結:就是輸入乙個整數對代表兩個融點(也就是物件,融點是術語),如果兩個融點未連通,則將它們連在一起(呼叫union方法,下面黑色的部分),並列印;如果兩個融點已經連通則處理下一對資料(下圖灰色的部分,什麼也不幹)。過程如下:

設計乙個資料結構來儲存程式已知的所有整數對的足夠多的資訊,並用它們來判斷乙個新物件是否相連。這個問題也稱為動態連通性問題

網路(計算機之間的連線)

變數名的等價性

數學集合

這裡使用網路方面的術語,將物件稱為融點,將整數對稱為連線,將等價類稱為連通分量或者簡稱分量。假設用0到n-1的整數表示n個融點

定義的api:

先給出最終**,後面會討論一步一步怎麼優化的:

public

class uf

}public

intfind(int p)

return p;

}public

intcount()

public boolean connected(int p, int q)

public

void

union(int p, int q)

count--;

}private

void

validate(int p)

}public

static

void

main(string args)

stdout.println(uf.count() + " components");}}

成本模型(優劣性怎麼比): 在研究union-find 的api的各種演算法時,我們統計的是陣列的訪問次數(訪問任意陣列元素的次數,無論讀寫)

public

class quickfinduf

public

intcount()

public

intfind(int p)

private

void

validate(int p)

}public boolean connected(int p, int q)

public

void

union(int p, int q)

public

static

void

main(string args)

stdout.println(uf.count() + " components");}}

演算法分析:find很快,union很慢要掃瞄整個陣列

上圖中的connected的方法描述不對,可能是老版本的

quick-find 演算法的執行時間對於最終只得到少數連通分量的一般應用是平方級別的

每個觸電所對應的id 元素都是同乙個分量中的另乙個觸點的名稱(也可能是它自己)——稱之為鏈結

每個連通分量是通過鏈來連線的,find返回父類(也就是類的代表,父類初始化為自己)(說白了就是樹,具體看**)

public

class quickunionuf

}public

intcount()

public

intfind(int p)

// validate that p is a valid index

private

void

validate(int p)

}public boolean connected(int p, int q)

public

void

union(int p, int q)

public

static

void

main(string args)

stdout.println(uf.count() + " components");}}

森林的表示上面的表示形式也稱為森林,一棵樹就是乙個類別

quick-union 演算法比quick-find演算法更快,因為他不需要為每對輸入遍歷整個陣列,最好線性,最壞平方級別,quick-union算是一種改進

我們只需要簡單地修改quick-union演算法就能保證像這樣的糟糕情況不在出現(下圖中所示,大樹接到小樹上了,不利於find)。

將會記錄每一棵樹的代銷並總是將較小的數連線到較大的數上(樹的深度對find的影響很大)

歸併兩個含有2n

個節點的樹時,由此樹的高度增加到了n+

1 ,因此,加權quick-union能夠保證對數級別的效能。

理想情況下,我們希望每個節點都直接連線到它的根節點上(形成乙個完全扁平的樹,使find更快,單又不同於quick-find的做法),但我們又不想像quick-find演算法那樣通過大量的連線修改做到這一點。所以在檢查節點的同時將它們直接鏈到根節點上。rank越大,合併的次數越多,數也越大((1, 1)(2, 2)(4, 4)合併的軌跡都是這樣,rank越大,顯然樹也越大)

但是,最壞情況下不保證是常數級別。**就是一開始給出的最終**

演算法學習 Union Find演算法

union find演算法有它的實際用途。多用於動態連通的應用場景。union find演算法是 給出兩個節點,判斷它們是否連通,如果連通,是不需要給出具體的路徑的 舉兩個例子作為主要表現 1 在網路連線中,當發現沒有連線的兩個節點,可以把他們連線起來,一旦節點都連線起來,又能把多餘的線拆除,這時候...

《演算法》1 5union find演算法

union find的抽象類 author azhu date 2021 2 9 17 19 public abstract classuf 查詢觸點p所在分量的識別符號 param p 觸點 return 分量的識別符號 public abstract intfind int p 在p和q之間新增...

union find演算法的研究

三種union find演算法的效能特點演算法 建構函式 union find quick find演算法nn 1quick union演算法 n樹的高度 樹的高度 加權quick union演算法 nlgn lgnpublic intfind int p public void union int...