一.分治算法的基本思想
當我們求解某些問題時,由於這些問題要處理的數據相當多,或求解過程相當復雜,使得直接求解法在時間上相當長,或者根本無法直接求出。對於這類問題,我們往往先把它分解成幾個子問題,找到求出這幾個子問題的解法后,再找到合適的方法,把它們組合成求整個問題的解法。如果這些子問題還較大,難以解決,可以再把它們分成幾個更小的子問題,以此類推,直至可以直接求出解為止。這就是分治策略的基本思想。
二.分治算法求解問題的步驟
(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