分治演算法求解迴圈賽問題,分治演算法迴圈賽

來源:互聯網
上載者:User

分治演算法求解迴圈賽問題,分治演算法迴圈賽
一.分治演算法的基本思想

  當我們求解某些問題時,由於這些問題要處理的資料相當多,或求解過程相當複雜,使得直接求解法在時間上相當長,或者根本無法直接求出。對於這類問題,我們往往先把它分解成幾個子問題,找到求出這幾個子問題的解法後,再找到合適的方法,把它們組合成求整個問題的解法。如果這些子問題還較大,難以解決,可以再把它們分成幾個更小的子問題,以此類推,直至可以直接求出解為止。這就是分治策略的基本思想。

二.分治演算法求解問題的步驟

  (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 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.