算法系列之分治(分而治之)


       分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即:

使用分治算法的问题必须满足一下要求:

1.此问题可以被分解为多个与原问题性质相同的子问题(子问题是原问题的规模缩小到一定的程度就可以容易地解决的)

2.子问题的解可以合并成原问题的解

3.各个子问题之间是独立的,没有包含公共解



原问题在分解过程中,递归地求解子问题

由于递归都必须有一个终止条件,因此,当分解后的子问题规模足够小时,应能够直接求解


可使用分治法求解的一些经典问题
 
(1)二分搜索
(2)大整数乘法
(3)Strassen矩阵乘法
(4)棋盘覆盖
(5)合并排序
(6)汉诺塔
(7)快速排序
(8)线性时间选择
(9)最接近点对问题
(10)循环赛日程表

说再多,也没有来几个例子讲解更让人能理解,so 例子来了

一个简单的二分查找帮助理解,


L=(3,12,24,37,45,53,61,78,90,100 ),查找Key=24的记录

mid=(low+high)/2向下取整,即如 mid=(1+4)/2=2


            3     12 24 37     45      53 61 78 90   100

           low                      mid                             high

  2445  继续在前半个表中用二分查找法查找

            3       12     24     37               45  53 61 78 90 100

             low    mid                high

2412 继续在后半个表中用二分查找法查找

            3 12  24                37              45 53 61 78 90 100

                       low(mid)      high 

即查到mid=24,故结束(此过程在编码中一般用递归向下查找)



  
int BinSearch(int Array[],int low,int high,int key)  //key为要找的值 {       if (low<=high)       {           int mid = (low+high)/2;           if(key == Array[mid])               return mid;           else if(key<Array[mid])               return BinSearch(Array,low,mid-1,key);           else if(key>Array[mid])               return BinSearch(Array,mid+1,high,key);       }       else           return -1;   }