本文内容

  • 分治策略
  • 分治步骤
  • 从合并排序看“分治策略”

 

分治策略

分治法(divide-and-conquer),“分治法策略”是一种很重要的算法。顾名思义,“分而治之”。将原问题划分成 n 个规模较小,而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。

“分治策略”是很多高效算法的基础,如快速排序、归并排序、傅立叶变换(快速傅立叶变换)。

 

分治步骤

  • 分解(Divide):将原问题分解成一系列子问题;
  • 解决(Conquer):递归地解各个子问题。若子问题足够小,则直接求解;
  • 合并(Combine):将子问题的结果合并成原问题的解。

备注:

如何划分子问题的规模?从大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。换句话说,将一个问题分成大小相等的k个子问题的处理方法是行之有效的。许多问题可以取 k = 2。这种使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。

 

从合并排序看“分治策略”

合并排序(Merge Sort)算法完全按照上述模式,步骤如下:

  • 分解:将 n 个元素分成各含 n/2 个元素的子序列;
  • 解决:用合并排序发对两个子序列递归地排序;
  • 合并:合并两个已排序的子序列得到排序结果。

 

元素头文件 MyElement.h
#ifndef MYELEMENT_H_INCLUDED
#define MYELEMENT_H_INCLUDED
 
#define N 10
#define LQ(a,b) ((a)<=(b))
 
typedef int ElementType;
 
void Print(ElementType e[], int n);
 
#endif // MYELEMENT_H_INCLUDED

相关文章: