分治的基本思想:将一个规模为n的问题分解为K个规模较小的子问题,这些子问题互相独立且与原问题相同,递归地求解这些子问题,然后将各个子问题的解合并起来,得到原问题的解。(在许多问题中,往往取K=2)。
分治的设计手段:根据分治的思想可看出,用它设计的程序一般应是一个递归程序,分治的设计手段就是递归。
eg:若连续函数f(x)在(a,b)内,满足f(a)*f(b)<0,则在(a,b)内至少有一个零点α。若仅有一个零点,可用对分原理求解方程f(x)=0于区间(a,b)的根。
//对分
float f(float x){
return //f(x)的具体形式
}
float duifen(float a,float b){
float f(float x);
float m;
while(fabs(b-a)>1e-6){
m=(a+b)*0.5;
if(f(m)*f(b)<0)a=m;
if(f(a)*f(m)<0)b=m;
if(fabs(f(m)-0)<=1e-5)return m;
}
}
//分治
float f(float x){
return ;//f(x)的具体形式
}
float fenzhi(float a,float b){
float f(float x);
float m;
m=(a+b)*0.5;
if(fabs(f(m)-0)<1e-6)return m;
if(f(a)*f(m)<0)return fenzhi(a,m);
if(f(m)*f(b)<0)return fenzhi(m,b);
}
eg:用分治法编程求n个浮点数之中的最大值。
/思想一
float mymax(float *a,int l,int r){
int m;
float max,t1,t2;
if(l==r)max=a[l];
else{
m=(l+r)/2;
t1=mymax(a,l,m);
t2=mymax(a,m+1,r);
max=t1>t2?t1:t2;
}
return max;
}
//思想二
float mymax(float *a,int n){
float max,t1,t2;
int m;
if(n==1)return a[0];
t1=mymax(a,n/2);
t2=mymax(a+n/2,n-n/2);
max=t1>t2?t1:t2;
return max;
}
eg:求下列函数的值。 y=x^n ,x为浮点数,n为非负整数
//直接法
float mypow(float x,int n){
float p=1;
for(int i=0;i<n;i++){
p*=x;
}
return p;
}
//递归
float mypow(float x,int n){
if(n==0&&x!=0) return 1;
return x*mypow(x,n-1);
}
//分治
float mypow(float x,int n){
if(n==0&&x!=1)return 1;
if(n==1)return x;
return mypow(x,n/2)*mypow(x,n-n/2);
}