Algs4-1.5.16均摊成本的图像QuickFindUF、QuickUnionUF、WeightedQuickFindUF、WeightedQuickUnionUF
1)QuickFindUF(1000点)
2)QuickUnionUF(1000点)
3)WeightedQuickFindUF(2000点)
4)WeightedQuickUnionUF(1000点)
CODE:
public class QuickFindUF
{
private int[] id;
private int count;
//
private int connTimes=0;
private int cost=0;
private int total=0;
public int ConnTimes()
{return connTimes;}
public int Cost()
{return cost;}
public int Total()
{return total;}
//
public QuickFindUF(int N)
{
count=N;
id=new int[N];
for (int i=0;i<N;i++)
id[i]=i;
}
public int count()
{return count;}
public boolean connected(int p,int q)
{
connTimes++;
cost=2;
total=total+2;
return find(p)==find(q);
}
public int find(int p)
{return id[p];}
public void union(int p,int q)
{
int pID=find(p);
int qID=find(q);
//
cost=cost+2;
total=total+2;
//
if (pID==qID) return;
for (int i=0;i<id.length;i++)
{
//
cost++;
total++;
//
if(id[i]==pID)
{
id[i]=qID;
//
cost++;
total++;
//
}
}
count--;
}
public static void main(String[] qrgs)
{
int N=StdIn.readInt();
QuickFindUF uf=new QuickFindUF(N);
StdDraw.setXscale(0,1000);
StdDraw.setYscale(0,1000);
StdDraw.setPenRadius(0.005);
while (!StdIn.isEmpty())
{
//draw
if (uf.ConnTimes()>0)
{
StdDraw.setPenColor(StdDraw.GRAY);
StdDraw.point(uf.ConnTimes(),uf.Cost());
//
StdDraw.setPenColor(StdDraw.RED);
StdDraw.point(uf.ConnTimes(),uf.Total()/uf.ConnTimes());
}
//
int p=StdIn.readInt();
int q=StdIn.readInt();
if(uf.connected(p,q)) continue;
StdOut.println(p+ " " +q);
uf.union(p,q);
}//end while
}//end main
}//end class
public class QuickUnionUF
{
private int[] id;
private int count;
//
private int connTimes=0;
private int cost=0;
private int total=0;
public int ConnTimes()
{return connTimes;}
public int Cost()
{return cost;}
public int Total()
{return total;}
//
public QuickUnionUF(int N)
{
count=N;
id=new int[N];
for (int i=0;i<N;i++)
id[i]=i;
}
public int count()
{return count;}
boolean connected(int p,int q)
{
connTimes++;
cost=0;
return find(p)==find(q);
}
public int find(int p)
{
cost++;
total++;
while(p!=id[p])
{
p=id[p];
cost++;
total++;
}
return p;
}
public void union(int p,int q)
{
int pRoot=find(p);
int qRoot=find(q);
if(pRoot==qRoot) return;
id[pRoot]=qRoot;
count--;
cost++;
total++;
}
public static void main(String[] qrgs)
{
int N=StdIn.readInt();
QuickUnionUF uf=new QuickUnionUF(N);
StdDraw.setXscale(0,1000);
StdDraw.setYscale(0,1000);
StdDraw.setPenRadius(0.005);
while (!StdIn.isEmpty())
{
int p=StdIn.readInt();
int q=StdIn.readInt();
//draw
if (uf.ConnTimes()>0)
{
StdDraw.setPenColor(StdDraw.GRAY);
StdDraw.point(uf.ConnTimes(),uf.Cost());
//
StdDraw.setPenColor(StdDraw.RED);
StdDraw.point(uf.ConnTimes(),uf.Total()/uf.ConnTimes());
}
//
if(uf.connected(p,q)) continue;
StdOut.println(p+ " " +q);
uf.union(p,q);
}//end while
}//end main
}//end class
public class WeightedQuickFindUF
{
private int[] id;
private int[] sz;
private int count;
//
private int connTimes=0;
private int cost=0;
private int total=0;
public int ConnTimes()
{return connTimes;}
public int Cost()
{return cost;}
public int Total()
{return total;}
//
public WeightedQuickFindUF(int N)
{
count=N;
id=new int[N];
for (int i=0;i<N;i++)
id[i]=i;
//
sz=new int[N];
for (int i=0;i<N;i++)
sz[i]=1;
}
public int count()
{return count;}
boolean connected(int p,int q)
{
connTimes++;
cost=2;
total=total+2;
return find(p)==find(q);
}
public int find(int p)
{
cost++;
total++;
return id[p];
}
public void union(int p,int q)
{
int pID=find(p);
int qID=find(q);
if (pID==qID) return;
int totalSize=sz[p]+sz[q];
int oldID;
int newID;
cost=cost+4;
total=total+4;
if(sz[p]<sz[q])
{
oldID=pID;
newID=qID;
}
else
{
oldID=qID;
newID=pID;
}
for (int i=0;i<id.length;i++)
{
cost=cost+2;
total=total+2;
if(id[i]==oldID)
{
id[i]=newID;
cost++;
total++;
}
if(id[i]==newID)
{
sz[i]=totalSize;
cost++;
total++;
}
}
count--;
}
//
public static void main(String[] qrgs)
{
int N=StdIn.readInt();
WeightedQuickFindUF uf=new WeightedQuickFindUF(N);
//
StdDraw.setXscale(0,2000);
StdDraw.setYscale(0,2000);
StdDraw.setPenRadius(0.005);
while (!StdIn.isEmpty())
{
int p=StdIn.readInt();
int q=StdIn.readInt();
//draw
if (uf.ConnTimes()>0)
{
StdDraw.setPenColor(StdDraw.GRAY);
StdDraw.point(uf.ConnTimes(),uf.Cost());
//
StdDraw.setPenColor(StdDraw.RED);
StdDraw.point(uf.ConnTimes(),uf.Total()/uf.ConnTimes());
}
//
if(uf.connected(p,q)) continue;
StdOut.println(p+ " " +q);
uf.union(p,q);
}//end while
}//end main
}//end class
public class WeightedQuickUnionUF
{
private int[] id;
private int[] sz;
private int count;
//
private int connTimes=0;
private int cost=0;
private int total=0;
public int ConnTimes()
{return connTimes;}
public int Cost()
{return cost;}
public int Total()
{return total;}
//
public WeightedQuickUnionUF(int N)
{
count=N;
id=new int[N];
for (int i=0;i<N;i++)
{
id[i]=i;
StdOut.printf("%3d",i);
}
StdOut.println();
//
sz=new int[N];
for (int i=0;i<N;i++)
sz[i]=1;
//
}
public int count()
{return count;}
boolean connected(int p,int q)
{
connTimes++;
cost=0;
return find(p)==find(q);
}
public int find(int p)
{
cost++;
total++;
while(p!=id[p])
{
cost++;
total++;
p=id[p];
}
return p;
}
public void union(int p,int q)
{
int i=find(p);
int j=find(q);
StdOut.printf(" i=%d j=%d\n",i,j);
if(i==j) return;
cost=cost+6;
total=total+6;
if(sz[i]<sz[j])
{
id[i]=j;
sz[j]=sz[j]+sz[i];
}
else
{
id[j]=i;
sz[i]=sz[i]+sz[j];
}
count--;
}
public static void main(String[] qrgs)
{
int N=StdIn.readInt();
WeightedQuickUnionUF uf=new WeightedQuickUnionUF(N);
//
StdDraw.setXscale(0,1000);
StdDraw.setYscale(0,1000);
StdDraw.setPenRadius(0.005);
//
while (!StdIn.isEmpty())
{
int p=StdIn.readInt();
int q=StdIn.readInt();
//draw
if (uf.ConnTimes()>0)
{
StdDraw.setPenColor(StdDraw.GRAY);
StdDraw.point(uf.ConnTimes(),uf.Cost());
//
StdDraw.setPenColor(StdDraw.RED);
StdDraw.point(uf.ConnTimes(),uf.Total()/uf.ConnTimes());
}
//
if(uf.connected(p,q)) continue;
StdOut.printf("p=%d q=%d",p,q);
uf.union(p,q);
}//end while
}//end main
}//end class