一、分治算法的思想
将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同,只要解决子问题,就可得到原问题的解。
二、分治算法的解题过程
(1)分解,将要解决的问题划分成若干个规模较小的同类问题。
(2)求解,当子问题划分到足够小时,用简单的方法解决。
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
三、实例演练
欧洲冠军杯比赛日程安排
代码实现:
#include "stdio.h" #include "iostream" #define MAX 64 int a[MAX + 1][MAX + 1] = { 0 }; void gamecal(int k, int n);//声明处理编号k开始的n个球队的日程 int main() { int m, i, j; printf("参赛球队数:"); scanf("%d", &m); j = 2; for (i = 2; i < 8;i++) { j = j * 2; if (j==m) { break; } } if (i>=8) { printf("参赛球队必须为2的整数次幂,并且不超过64!\n"); getchar(); return 0; } gamecal(1, m); printf("\n编号"); for (i = 2; i <= m;i++) { printf("%2d天", i - 1); } printf("\n"); for (i = 2; i <= m;i++) { for (j = 1; j <= m;j++) { printf("%4d", a[i][j]); } printf("\n"); } system("pause"); return 0; } void gamecal(int k, int n) { int i, j;//参赛的球队编号 if (n==2) { a[k][1] = k;//参赛球队的编号 a[k][2] = k + 1;//对阵球队编号 a[k + 1][1] = k + 1;//参赛球队编号 a[k + 1][2] = k;//对阵球队编号 } else { gamecal(k, n / 2); gamecal(k + n / 2, n / 2); for (i = k; i < k + n/2;i++)//填充右上角 { for (j = n / 2 + 1; j <= n;j++) { a[i][j] = a[i + n / 2][j - n / 2]; } } for (i = k + n / 2; i < k + n;i++) { for (j = n / 2 + 1; j <= n;j++) { a[i][j] = a[i - n / 2][j - n / 2]; } } } }
实现结果:
四、总结
枚举、回溯、分治算法利用了计算机工作的第一个特点:高速,不怕数据量大。分治算法思想利用了计算机工作的第二个特点:重复。