分治算法试题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

分治算法

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

【例3】在n个元素中找出最大元素和最小元素。

我们可以把这n个元素放在一个数组中,用直接比较法求出。算法如下:

BEGIN

MIN:=A[1]:MAX:=A[1];

FOR I:=2 TO N DO

BEGIN

IF A[I] > MAX THEN MAX:=A[I];

IF A[I] < MIN THEN MIN:=A[I];

END.

上面这个算法需比较2(N-1)次,即时间复杂度是2(N-1)。能否找到更好的算法呢?我们用分治策略来讨论。

我们把n个元素分成

A1={A[1],...,A[int(n/2)]}

A2={A[INT(N/2)+1],...,A[N]}

两组,分别求这两组的最大值和最小值,然后分别将这两组的最大值和最小值相比较,求出全部元素的最大值和最小值。

如果A1和A2中的元素多于两个,则再用上述方法各分为两个子集。直至子集中元素至多两个元素为止。

例如有下面一组元素:

-13,13,9,-5,7,23,0,15。用分治策略比较的过程如下:

图中每个方框中,左边是最小值,右边是最大值。从图中看出,用这种方法一共比较了10次,比直接比较法的14次减少4次,即约减少了1/3。

算法如下:

procedure maxmin(i,j,max,min);

BEGIN

CASE J-I OF

0:MAX:=A[I];MIN:=A[I];

1:IF A[I] < A[J] THEN MIN:=A[I];MAX:A[J];

ELSE MAX:=A[I];MIN:=A[J];

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名运动员的情况,递归终止条件}

begin

A [K, 0]: =K; A [K, 1]: =K+I;

A [K+I, 0]: =K+I; A [K+I, 1]: =K;

end

else

begin

arrangment (K, N div 2);

arrangment (K + N div 2, N div 2); {递归分解原问题与求解子问题}

for I: =K to K + (N div 2) -1 do {合并子问题, 构造原问题的解 A[I,J]} for J: = (N div 2) to N-1 do

A [I, J]:=A [I+(N div 2), J-(N div 2)];

for I:=K+(N div 2) to K+N-1 do

for J:= (N div 2) to N-1 do

A [I, j]:=A [I-(N div 2), J-(N div 2)];

end; end;

相关文档
最新文档