/**
* union-find的抽象類
* @author: azhu
* @date: 2021/2/9 17:19
*/public
abstract
classuf}
/** * 查詢觸點p所在分量的識別符號
* @param p 觸點
* @return 分量的識別符號
*/public
abstract
intfind
(int p)
;/**
* 在p和q之間新增一條連線
* @param p 觸點p
* @param q 觸點q
*/public
abstract
void
union
(int p,
int q)
;/**
* 獲取連通分量的數量
* @return 分量的數量
*/public
intcount()
/** * 如果p和q存在於同乙個分量之中則返回true
* @param p 觸點p
* @param q 觸點q
* @return 是否存在於同乙個分量之中
*/public
boolean
connected
(int p,
int q)
}
/**
* uf的quickfind實現
* @author: azhu
* @date: 2021/2/9 17:45
*/public
class
quickfinduf
extends
uf@override
public
intfind
(int p)
@override
public
void
union
(int p,
int q)
//將p所在分量的所有觸點 重新命名 為q所在的分量名
for(
int i =
0; i < id.length; i++)}
count--;}
}
由於我們使用quickfind演算法來解決動態連通性問題並且最後只得到了乙個連通分量。
因此至少呼叫n-1
次union()
,所以至少訪問陣列(n+3)(n-1) ~ n^2
次。
/**
* uf的quickunion實現
* @author: azhu
* @date: 2021/2/9 18:08
*/public
class
quickunionuf
extends
uf@override
public
intfind
(int p)
return p;
}@override
public
void
union
(int p,
int q)
//合併兩棵樹
id[proot]
= qroot;
count--;}
}
quickunion演算法中的find()
方法訪問陣列的次數為1
加上給定觸點所對應的節點中的深度的兩倍。
union()
和connected()
訪問陣列的次數為兩次find()
操作(如果union()
中給定的兩個觸點分別存在於不同的樹種則還需要加1
)。
在最壞的情況下,處理n
對整數所需的所有find()
操作訪問陣列的總次數為3+5+7+...+(2n-1) ~ n^2
。
/**
* @author: azhu
* @date: 2021/2/9 18:17
*/public
class
weightedquickunionuf
extends
quickunionuf
}@override
public
void
union
(int p,
int q)
//將小樹的根結點連線到大樹的根結點上
if(sz[i]
< sz[j]
)else
count--;}
}
對於n
個觸點,加權quickunion演算法構造的森林中的任意結點的深度最多為lgn
。
加權quickunion演算法處理n
個觸點和m
條連線時最多訪問陣列cmlgn
次,其中c
為常數。
研究各種基本問題是所遵循的基本步驟:
完整而詳細地定義問題,找出解決問題所必須的基本抽象操作,定義乙份api
簡潔地實現一種初級演算法,給出乙個精心組織的開發用例並使用實際資料作為輸入。
當實現所能解決的問題的最大規模達不到期望時決定改進還是放棄。
逐步改進實現,通過經驗性分析或數學分析驗證改進後的效果。
用更高層次的抽象表示資料結構或演算法來設計更高階的改進版本。
如果可能盡量為最壞情況下的效能提供保證,但在處理普通資料時也要保證有良好的效能。
在適當的時候將更細緻的深入研究留給有經驗的研究者並繼續解決下乙個問題。
四 union find演算法
問題 問題總結 就是輸入乙個整數對代表兩個融點 也就是物件,融點是術語 如果兩個融點未連通,則將它們連在一起 呼叫union方法,下面黑色的部分 並列印 如果兩個融點已經連通則處理下一對資料 下圖灰色的部分,什麼也不幹 過程如下 設計乙個資料結構來儲存程式已知的所有整數對的足夠多的資訊,並用它們來判...
演算法學習 Union Find演算法
union find演算法有它的實際用途。多用於動態連通的應用場景。union find演算法是 給出兩個節點,判斷它們是否連通,如果連通,是不需要給出具體的路徑的 舉兩個例子作為主要表現 1 在網路連線中,當發現沒有連線的兩個節點,可以把他們連線起來,一旦節點都連線起來,又能把多餘的線拆除,這時候...
union find演算法的研究
三種union find演算法的效能特點演算法 建構函式 union find quick find演算法nn 1quick union演算法 n樹的高度 樹的高度 加權quick union演算法 nlgn lgnpublic intfind int p public void union int...