並查集的初步學習

2021-07-02 05:42:07 字數 2106 閱讀 4826

一、並查集是什麼:並查集是對一堆具有相互關聯的資料中快速找出兩個物件是否具有關聯關係的資料集合,這個問題看似簡單實際上牽扯到大量的計算。

二、並查集的解決思路:

a、先初始化乙個陣列,然後再讓這個陣列的內容指向本身。

b、若這個陣列某個下標與某個下標具有關聯性,那麼就講某個下標的內容指向另乙個下標。

解決這個問題有3(4)種解決思路。

1、quick find: 顧名思義;就是快速查詢的意思,它的優點就是快速判定兩個元素是否具有關聯性。

原理:就是將具有關聯關係的元素內容改為相同的乙個元素即可。

圖:**:

public

classquickfind

}voidunion(intp1,intp2) }}

//優點就在這裡,只需要倡廉時間就可以快速查出關聯關係

booleanconnected(intp1,intp2)

2 quick union  顧名思義,就是快速建立關聯關係

這裡的原理是,首先將每個點都建立在指向自身的基礎上,以後每次新增乙個點就使其指向上個節點。

圖:**:

public

classquickunion

}//缺點  每次查詢關聯關係都要尋找根節點

booleanconnected(intp1,intp2)

//優點 快速建立關聯關係,而非遍整個陣列

voidunion(intp1,intp2)

intgetroot(intp)

}3 unionfind 顧名思義:它結合了 1 2兩種方法的優點。

實現思路,再建立乙個陣列,用來記錄當前節點數的數目,這個就盡量避免了高度的快速增長。

圖:**:

public

classunionfind

}voidunion(intp,intq)else

}booleanconnected(intp,intq)

introot(intp)

}4 我們可以對 3 進行優化,優化的地方在於每次遍歷的時候發現根節點過長,就將根節點上移,減小根節點的遍歷深度。

public

classunionfind2

}voidunion(intp,intq)else

}booleanconnected(intp,intq)

introot(intp)

returnp;}}

下面是自己寫的測試資料

使用隨機插入500000個資料,然後隨機查詢500000次

對照結果

1 quick find 用時196768 毫秒

2 quick union用時845483毫秒

3 union find 用時128 毫秒

4 union find 的優化用時103毫秒

效能差距如此之大,可見往往更快的電腦硬體不能解決效能上的瓶頸。所以說我們已改從演算法上對其優化

並查集初步

對資料進行合併,查詢某個資料的祖先,建立資料間的聯絡。int fathe mx 根節點 int rank x 樹的高度 void ini intfind int x intunite int x,int y 1 wireless network 題意 有n臺電腦,電腦的覆蓋範圍為k公尺,在覆蓋範圍內...

並查集初步

有若干節點,並將其中一些節點對進行連線,要判斷任意兩個節點是否連通 有路徑到達,而不要求直接連線 連通後就不會斷開連通關係,此時就可以使用並查集。並查集擅長動態維護許多具有傳遞性的關係,能在無向圖中維護節點之間的連通性。要判斷兩個節點是否連通,可以把連通的節點加入到各自的集合裡,也就是,同乙個集合裡...

並查集初步

並查集可以動態維護若干個不重疊的集合,支援查詢和合併兩個操作,在實際應用中比較廣泛。並查集的主要功能是查詢元素的集合歸屬,同時支援集合的合併操作。並查集的實現方法 對於每個集合,選擇乙個元素作為其代表元素,而若兩個元素所在集合的代表元素相同,則說明它們在同乙個集合中。具體如何實現呢?有一種思路,可以...