二分(整数二分和浮点数二分)

本文详细介绍了二分法的概念,包括它能解决的问题、本质和适用条件。二分法通过不断缩小搜索区间,用于在有序数列中查找满足特定条件的边界。文章提供了两种整数二分模板,并提及浮点数二分的处理方式,通过实例解释了如何运用二分法求解问题,如寻找平方根。
摘要由CSDN通过智能技术生成

二分法能解决的问题

用于一段区间求满足题意的单点问题,某个性质将区间分成满足性质和不满足性质
的两半,二分法就可以寻找该性质的两个边界(即不满足性质的边界和满足性质的
边界),但要注意边界问题十分重要

二分法的本质

二分的本质是用一个判定问题来代替查找,逐步缩小区间
锁定答案,二分部的本质不是单调性。

二分的条件

一定要在有序的数列中查找。

二分的思想

设一段区间[l,r],某性质将区间[l,r]分成两部分,前部分不满足该性质,后半部分满足该性质,前部分的分界点为点(1)区间为[l,(1)],后部分的分界点为点(2)区间为[(2),r]。
1.找到区间[l,r]中间值mid
2.检查mid是否满足该性质,判定满足和不满足,根据mid所在区间去更新区间缩小范围。

拿到一个二分题目首先要要思考那个性质可以分好区间,判定mid后该如何缩小区间。

二分模板(整数二分)

二分模板根据划分的区间不同有两个

1.当区间[l,r]划分成[l,mid]和[mid+1,r]时,
更新操作
             r=mid(答案区间在【l,mid】)
   或     l=mid+1(答案区间【mid+1,r】)
计算mid时不需要加1.(一般求点(2))

int bsearch_1(int l,int r)
{
    while(l<r)
    {
      int mid=l+r>>1;		//下取整		
      if(check(mid))	r=mid;
      else	l=mid+1;
    }
    return l;
}

2.当区间[l,r]划分成[l,mid-1]和[mid,r]时,
更新操作
       r=mid-1(答案区间在【mid,r】)
或  l=mid(答案区间在【l,mid-1】)
计算mid时需要加1.(一般求点(1))

int bsearch_2(int l,int r)
{
    while(l<r)
    {
    int mid=l+r+1>>1;		//上取整
    if(check(mid))	l=mid;
    else	r=mid-1;
   }
   return 1;
}

浮点数二分

浮点数二分相比较于整数二分无边界问题,也可借助于整数二分的模板
下面就举例解释一下:
eg:求x的平方根
#include<iostream>
using namespace std;
int main()
{
	double x;
	cin>>x;
	double l=0,r=x;
	while(r-l>1e-8)
	{
	   double mid=(l+r)/2;
	   if(mid*mid>=x)
	     r=mid;
	   else
	     l=mid;
	}
	printf("%lf\n",l);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值