標籤:java演算法 路徑壓縮 折半路徑壓縮
能否找到一個保證線性時間效能的演算法,這個問題非常難。還有一些改進加權快速合并演算法的簡單方法。理想情況下,我們希望每個結點直接連到其樹根,但又不想像快速合并演算法那樣改變大量連線。我們可以簡單地把所檢查的所有結點連到根上,從而接近理想情況。我們可以很容易地實現此方法,方法名為壓縮路徑,在合併作業時,經過每條路徑就加一條連線,也就是把一路上遇到的對應於每個頂點的id數組值都設為連到樹根上。淨結果就是幾乎完全把樹變平坦了,逼近快速尋找法所獲得的理想狀態。
還有其他許多方法來實現路徑壓縮下面程式實現路徑壓縮的方法是:使在通向樹根的路中的每條連線都指向路徑的下一個結點,此方法比全路徑壓縮要簡單些,並能獲得同樣的淨結果。我們把此演算法稱為“折半路徑壓縮的加權快速合并”。
public class QuickUW{ public static void main(String[] args) { int N=Integer.parseInt(args[0]); int id[]=new int[N],sz[]=new int[N]; for(int i=0;i<N;i++) { id[i]=i; sz[i]=1; } for(In.init();!In.empty();) { int i,j,p=In.getInt(),q=In.getInt(); for(i=p;i!=id[i];i=id[i]) id[i]=id[id[i]]; for(j=q;j!=id[i];j=id[j]) id[j]=id[id[j]]; if(i==j) continue; if(sz[i]<sz[j]) { id[i]=j; sz[j]+=sz[i]; } else { id[j]=i; sz[j]+=sz[j]; } }}
本文出自 “飛魚技術” 部落格,請務必保留此出處http://flyingfish.blog.51cto.com/9580339/1622754
JAVA演算法4——連通性問題之路徑壓縮的加權快速合并演算法