你的位置:首页 > 软件开发 > Java > 分治算法求解循环赛问题

分治算法求解循环赛问题

发布时间:2017-12-08 19:00:04
一.分治算法的基本思想  当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果 ...

分治算法求解循环赛问题

一.分治算法的基本思想

  当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。

二.分治算法求解问题的步骤

  (1)  分解,将要解决的问题划分成若干规模较小的同类问题;
  (2)  求解,当子问题划分得足够小时,用较简单的方法解决;
  (3)  合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。

三.分治算法的应用场景

运用分治策略解决的问题一般来说具有以下特点:
  (1)  原问题可以分解为多个子问题这些子问题与原问题相比,只是问题的规模有所降低,其结构和求解方法与原问题相同或相似。
  (2)  原问题在分解过程中,递归地求解子问题由于递归都必须有一个终止条件,因此,当分解后的子问题规模足够小时,应能够直接求解。
  (3)  求解并得到各个子问题的解后应能够采用某种方式、方法合并或构造出原问题的解。

四.循环赛日程表问题

问题:设有n=2^k个球队参加循环赛,要求设计一个满足以下要求比赛日程表:
  (1)  每支球队必须与其他n-1支球队各赛一次;
  (2)  每支球队一天只能参赛一次;
  (3)  循环赛在n-1天内结束。

  按此要求将比赛日程表设计成有 n 行和 n 列的一个表。在表中的第 i 行,第 j 列处填入为第 i 个球队在第 j 天所遇到的球队。其中 1 ≤ i ≤ n,2 ≤ j ≤ n。8 个球队的比赛日程表如下图:

  分治算法求解循环赛问题

五.分治法求解循环赛问题

 1 /** 2  * 分治算法:循环赛日程表 3  * 题目:2^n支球队,进行循环赛,要求如下: 4  * (1)每支球队必须与其他n-1支球队各赛一次; 5  * (2)每支球队一天只能参赛一次; 6  * (3)循环赛在n-1天内结束。 7  * @author Administrator 8  * 9 */10 public class Dispatch {11  /**12   * 循环赛日程安排13   * @param table 循环赛日程表14   * @param n 球队的数量15  */16  private void scheduleTable(int [][] table,int n) {17   //只有一支球队18   if(n==1) {19    table[0][0]=1;20   }else {21    //填充左上区域矩阵22    int m=n/2;23    //递归确定左上区域矩阵24    scheduleTable(table, m);//既就是m支球队进行循环赛25    //填充右上区域矩阵26    //根据已经填充的左上区域,来确定右上区域矩阵27    for(int i=0;i<m;i++) {28     for(int j=m;j<n;j++) {29      table[i][j]=table[i][j-m]+m;30     }31    }32    33    //填充左下区域矩阵34    //根据右上区域矩阵填充左下区域矩阵35    for(int i=m;i<n;i++) {36     for(int j=0;j<m;j++) {37      table[i][j]=table[j][i];38     }39    }40    41    //填充右下区域矩阵42    //根据左上区域矩阵填充右下区域矩阵43    for(int i=m;i<n;i++) {44     for(int j=m;j<n;j++) {45      table[i][j]=table[i-m][j-m];46     }47    }48   }49  }50 51  public static void main(String[] args) {52   int n=16; //球队53   int [][] table=new int[n][n];54   Dispatch dispatch=new Dispatch();55   dispatch.scheduleTable(table, n);56   57   //打印结果58   for(int i=0;i<table.length;i++) {59    for(int j=0;j<table[i].length;j++) {60     System.out.print(table[i][j]+" ");61    }62    System.out.println();63   }64  }65 66 }

六.测试结果

  16支球队循环赛日程安排如下

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 2 1 4 3 6 5 8 7 10 9 12 11 14 13 16 15 3 4 1 2 7 8 5 6 11 12 9 10 15 16 13 14 4 3 2 1 8 7 6 5 12 11 10 9 16 15 14 13 5 6 7 8 1 2 3 4 13 14 15 16 9 10 11 12 6 5 8 7 2 1 4 3 14 13 16 15 10 9 12 11 7 8 5 6 3 4 1 2 15 16 13 14 11 12 9 10 8 7 6 5 4 3 2 1 16 15 14 13 12 11 10 9 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 10 9 12 11 14 13 16 15 2 1 4 3 6 5 8 7 11 12 9 10 15 16 13 14 3 4 1 2 7 8 5 6 12 11 10 9 16 15 14 13 4 3 2 1 8 7 6 5 13 14 15 16 9 10 11 12 5 6 7 8 1 2 3 4 14 13 16 15 10 9 12 11 6 5 8 7 2 1 4 3 15 16 13 14 11 12 9 10 7 8 5 6 3 4 1 2 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 

 

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:分治算法求解循环赛问题

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录