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