java disjoint_java – Union Find算法的应用(Disjoint Set)
要發(fā)生什么事情并不難.事實(shí)上非常聰明!
讓我們來看一個(gè)更復(fù)雜的例子:
a / b = 2.0, b / c = 3.0, c / d = 4.0, d / e = 5.0
在第一步(由UnionFind uf = new UnionFind(set)觸發(fā)的MakeSet)中,每個(gè)元素都設(shè)置為它自己的父元素,并且所有等級(jí)都設(shè)置為1.0:
parent(a) = a, rank(a) = 1.0
...
parent(e) = e, rank(e) = 1.0
在聯(lián)合步驟期間,節(jié)點(diǎn)的等級(jí)被設(shè)置為給定商,而父等級(jí)保持相同(第99行).所以在union(a,b,2.0)之后,父(a)= b,rank(a)= 2.0并且為任何節(jié)點(diǎn)n維持不變量:rank(n)/ rank(parent(n))= value,其中value來自正在處理的等式(商參數(shù)).
最后我們得到:
parent(a) = b, rank(a) = 2.0
parent(b) = c, rank(b) = 3.0
parent(c) = d, rank(c) = 4.0
parent(d) = e, rank(d) = 5.0
parent(e) = e, rank(e) = 1.0
在壓縮步驟期間,如果被搜索節(jié)點(diǎn)的父節(jié)點(diǎn)不是該節(jié)點(diǎn)的代表節(jié)點(diǎn),則將其設(shè)置為通過遞歸搜索父節(jié)點(diǎn)的父節(jié)點(diǎn)的父節(jié)點(diǎn)…并設(shè)置當(dāng)前節(jié)點(diǎn)的等級(jí)節(jié)點(diǎn)作為當(dāng)前等級(jí)乘以父節(jié)點(diǎn)的等級(jí)(第87行).所以最后我們到達(dá):
parent(a) = e, rank(a) = 120.0
parent(b) = e, rank(b) = 60.0
parent(c) = e, rank(c) = 20.0
parent(d) = e, rank(d) = 5.0
parent(e) = e, rank(e) = 1.0
所以確實(shí)等級(jí)(a)=等級(jí)(b)* 2.0,等級(jí)(b)=等級(jí)(c)* 3.0等正如輸入等式中給出的那樣.
注意,集合的代表節(jié)點(diǎn)(即最終父節(jié)點(diǎn),在該示例中為e)總是最終具有等級(jí)1.0.這就是為什么重復(fù)調(diào)用compressedFind并執(zhí)行第87行不會(huì)進(jìn)一步改變節(jié)點(diǎn)的等級(jí),一旦計(jì)算完并且設(shè)置了父節(jié)點(diǎn).
現(xiàn)在很容易看出第59行如何工作:如果查詢是a / b則排名(a)/ rank(b)= 120.0 / 60.0 = 2.0
總結(jié)
以上是生活随笔為你收集整理的java disjoint_java – Union Find算法的应用(Disjoint Set)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java回收类_Java的内存回收——J
- 下一篇: jni c向java传递数组_通过jni