算法学习——二分法拓展

     上一篇提到的都是整数情况下的二分查询问题,事实上二分法的应用远远不止此,下面介绍几个相关的例子。

例1 :如何计算 2 \sqrt{2} 2 的近似值?

     对   f ( x ) = x 2 \ f(x)=x^{2}  f(x)=x2来说,在   x ∈ [ 1 , 2 ] \ x\in[1,2]  x[1,2] 的范围内,   f ( x ) \ f(x)  f(x)是随着   x \ x  x 的增大而增大的,这就给二分法创造了条件,由于 2 \sqrt{2} 2 是无理数,因此只能获得它的近似值,这里不妨以精度到   1 0 − 5 \ 10^{-5}  105 为例来逼近 2 \sqrt{2} 2

     首先,令浮点型 left 和 right 的初值分别为1和2,然后通过比较 left 和 right 的中点 mid 处   f ( x ) \ f(x)  f(x) 的数值与2的大小来选择子区间进行逼近。有以下两种情况:

(1)如果   f ( m i d ) > 2 \ f(mid) > 2  f(mid)>2,说明   m i d > 2 \ mid > \sqrt{2}  mid>2 ,应当在   [ l e f t , m i d ] \ [left, mid]  [left,mid]的范围内继续逼近,故令   r i g h t = m i d \ right = mid  right=mid

(2)如果   f ( m i d ) &lt; 2 \ f(mid) &lt; 2  f(mid)<2,说明   m i d &lt; 2 \ mid &lt; \sqrt{2}  mid<2 ,应当在   [ l e f t , m i d ] \ [left, mid]  [left,mid]的范围内继续逼近,故令   l e f t = m i d \ left = mid  left=mid

     当   r i g h t − l e f t &lt; 1 0 − 5 \ right - left &lt; 10^{-5}  rightleft<105 时结束,此时已经满足精度要求,   m i d \ mid  mid 即为所求的近似值。

具体实现代码如下:

#include<stdio.h>
const double eps = 1e-5;
double f(double x) {
	return x * x;
}
double calSqrt() {
	double left = 1, right = 2, mid;
	while(right - left > eps) {
		mid = (left + right) / 2;
		if(f(mid) > 2) {
			 right = mid;
		} 
		else {
			left = mid;
		}
	}
	return mid;
}
int main(){
	printf("%f", calSqrt()); 
    return 0;
} 

未完待续…

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值