• 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 ",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

  • 相关阅读:
    【协议分析】Wireshark 过滤表达式实例
    学习Javascript闭包(Closure)
    如何解决 touchstart 事件与 click 事件的冲突
    JS实现控制HTML5背景音乐播放暂停
    $.ajax()方法详解
    js将汉字转为相应的拼音
    js 滚动到一定位置导航定位在页面最顶部
    javascript获取网页地址栏的id
    jquery 上传图片转为base64,ajax提交到后台
    jquery 图片转为base64
  • 原文地址:https://www.cnblogs.com/longjin2018/p/9854799.html
Copyright © 2020-2023  润新知