算法系列之分治(分而治之)
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即:
使用分治算法的问题必须满足一下要求:
1.此问题可以被分解为多个与原问题性质相同的子问题(子问题是原问题的规模缩小到一定的程度就可以容易地解决的)
2.子问题的解可以合并成原问题的解
3.各个子问题之间是独立的,没有包含公共解
原问题在分解过程中,递归地求解子问题
由于递归都必须有一个终止条件,因此,当分解后的子问题规模足够小时,应能够直接求解
(6)汉诺塔
说再多,也没有来几个例子讲解更让人能理解,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 high24<45 继续在前半个表中用二分查找法查找
3 12 24 37 45 53 61 78 90 100
low mid high24>12 继续在后半个表中用二分查找法查找
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;
}