算法系列之分治

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


       分治算法的基本思想是将一个规模为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,故结束(此过程在编码中一般用递归向下查找)



  
  1. int BinSearch(int Array[],int low,int high,int key)  //key为要找的值
  2. {  
  3.     if (low<=high)  
  4.     {  
  5.         int mid = (low+high)/2;  
  6.         if(key == Array[mid])  
  7.             return mid;  
  8.         else if(key<Array[mid])  
  9.             return BinSearch(Array,low,mid-1,key);  
  10.         else if(key>Array[mid])  
  11.             return BinSearch(Array,mid+1,high,key);  
  12.     }  
  13.     else  
  14.         return -1;  
















posted @ 2017-08-09 20:50  菜鸟阿都  阅读(71)  评论(0)    收藏  举报