ELSE MID:=(I+J) DIV 2
MAXMIN(I,MID,MAX1,MIN1);
MAXMIN(MID+1,J,MAX2,MIN2);
MAX:=MAX(MAX1,MAX2);
MIN:=MIN(MINI,MIN2);
END;
这种算法在比较数组元素所用时间比比较整数i、j所用的时间多得多时,是一种较优的算法,否则并不是优化的算法。这种算法的程序同学们自己完成。
分治策略在计算机算法中经常应用,而且大多数分为2个子问题,因此也叫做二分法。例如二分法检索、牛顿迭代法求方程的根等。
从上述的分治思想来看,运用分治策略解决的问题一般来说具有以下特点:
1、原问题可以分解为多个子问题,这些子问题与原问题相比,只是问题的规模有所降低,其结构和求解方法与原问题相同或相似。
2、原问题在分解过程中,递归地求解子问题,由于递归都必须有一个终止条件,因此,当分解后的子问题规模足够小时,应能够直接求解。
3、在求解并得到各个子问题的解后,应能够采用某种方式、方法合并或构造出原问题的解。
利于分治策略求解时,所需时间取决于分解后子问题的个数、子问题的规模大小等因素,而二分法,由于其划分的简单和均匀的特点,是经常采用的一种有效的方法。
不难发现,在分治策略中,由于子问题与原问题在结构和解法是的相似性,用分治方法解决的问题,大都采用了递归的形式。在各种时间复杂度为nlog2n的排序方法中,如分治合并排序、堆排序、快速排序等,都存在有分治的思想。实际上,进行分治处理的过程,从数据结构的角度看,其本质就是一个建树的过程。
思考与练习:完成并提交作业
1、在n个不同元素中找出第k个最小元素。
2、写出本节例题的Pascal程序。
3、赛程问题。有n个编号为1到n的运动员参加某项运动的单循环比赛,即每个运动员要和所有其他运动员进行一次比赛。试为这n个运动员安排一个比赛日程,使得每个运动员每天只进行一场比赛,且整个比赛在n-1天内结束。输入运动员人数n(n<=10000),输出一个n阶方阵A[1..N,0..N-1],当J>0时,A[1,J]表示第1名运动员在第J天的比赛对手。
【分析提示】由于N个运动员要进行单循环比赛,且在N-1天内要结束全部比赛,经过分析,当且仅当N为2的整次幂时,问题才有解,当然解是不惟一的。这样可以将运动员分成两组:1,2,…,N/2和N/2+1,N/2+2,…,N。给第一组运动员安排一个比赛日程,得到一个N/2阶的方阵A1;同时给第二组的运动员安排一个比赛日程,同样会得到一个N/2阶的一个方阵A2。考虑到比赛的性质,设定第1个运动员在某一天的比赛对手为第K个运动员,则第
K个运动员在同一天的比赛对手必然是第1个运动员,即若有A[1,J]=K,则A[1,K]=I。因此原问题的解(一个N阶方阵)可以由分解后的两个子问题的解,按下图所示形式合并起来。同时每一个子问题又可以按照上述的二分法分解下去,直至每个组中仅有2个运动员时为止。
┌─┬─┐
│A1│A2│
├─┼─┤ 数字矩阵方块
│A2│A1│
└─┴─┘
procedure arrangment (K, N: integer); begin
if n=2 then {处理只有2名运动员的情况,递归终止条件}