分治法及应用

文章介绍了分治算法的基本思想,即把大问题分解为小问题分别解决,再合并结果。通过几个例子展示了分治法如何用于寻找函数零点、求最大值和计算幂次。这些例子包括对分法求解方程的根、分治策略找浮点数数组的最大值以及用分治方式计算x的n次幂。
摘要由CSDN通过智能技术生成

分治的基本思想:将一个规模为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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值