首页 > 编程语言 >基础算法模板之二分

基础算法模板之二分

时间:2023-03-16 19:56:46浏览次数:45  
标签:二分 int double mid 算法 目标值 check 模板

二分

1. 算法分析

对于一个有序的序列,在查找某个值时可以优先考虑中间值与待查找值的关系来缩减查找范围,每次可以缩减一半,因此称为二分。
由于每次处理的数据量变为原来的一半,因此时间复杂度为o(\(log_2\)n)。

2.代码实现

二分可以分为整数二分和浮点数二分两种,整数二分有两种模板,分别对应不同的情况(目的是处理边界值情况)

  • 整数二分
// 一般用于求最小值或符合条件的位于最左侧的值
int b_serch1(int l,int r)
{
	while(l < r)
	{
		int mid = l + r >> 1;
		if(check(mid)) r = mid; // mid落在目标值右侧且mid可能是目标值
		else l = mid + 1;
	}
	return l;
}

// 一般用于求最大值或求符合条件的位于最右边的值
int b_serch2(int l,int r)
{
	while(l < r)
	{
		int mid = l + r + 1 >> 1;
		if(check(mid)) l = mid; // mid落在目标值左侧且mid可能是目标值
		else r = mid - 1;
	}
	return l;
}

/* 
记忆与区分:
	r = mid 对应 mid = l + r >> 1;
	l = mid 对应 mid = l + r + 1 >> 1;
*/
  • 浮点数二分
double b_serch3(double l,double r)
{
	while(r - l > 1e-6) // 根据题目要求选择精度
	{
		double mid = (l + r) / 2;
		if(check(mid)) r = mid; // mid落在目标值的右侧
		else l = mid;
	}
	return l;
}

标签:二分,int,double,mid,算法,目标值,check,模板
From: https://www.cnblogs.com/zhiao/p/17223924.html

相关文章

  • 基础算法模板之归并排序
    归并排序1.算法分析归并排序是分治的思想,将一个序列分为多个子序列,先让每个子序列有序,再合并已有序的子序列。把长度为n的输入序列分成两个长度为n/2的子序列;对这两个......
  • 基本算法模板之快速排序
    快速排序1.算法描述从数列中挑出一个元素,称为"基准";重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这......
  • Codeforces Round 406 (Div. 1) C. Till I Collapse 主席树上二分
    首先贪心是显然的,但是询问有n个先考虑一个朴素的主席树做法对于每个k,对于当前固定的L,二分R,用主席树查询一下[L,R]区间内的不同数个数是否大于K个(主席树的经典应用),更新......
  • 小白也能学会的精简版GA遗传算法(Python)
    今天无意中看到了一篇讲遗传算法的文章,文章内容很短,大部分都是代码,代码跟平时见到的遗传算法不同之所以要拿这篇文章来讲,主要是因为原文没有对代码进行解释,但是,这段......
  • CAS算法
    CAS算法今天在看了《Java并发编程的艺术》,学习如何减少上下问切换的时候,里面说到了通过CAS算法来更新数据,而它不需要加锁。不太理解什么是CAS算法,所以在网上搜罗半天资料,......
  • 泛型对象的应用:常规业务逻辑模板化,使用通用的父类来定义字段,具体字段由实现类来赋予数
    泛型对象的应用:常规业务逻辑模板化,使用通用的父类来定义字段,具体字段由实现类来赋予数据//DEMO-1publicinterfaceCommonTemplateService<T,F>{publicTbuildCa......
  • python 雪花算法demo
    importtimeimportloggingclassInvalidSystemClock(Exception):"""时钟回拨异常"""pass#64位ID的划分WORKER_ID_BITS=5DATACENTER_ID_B......
  • 【设计模式】模板方法
    1.模板方法(TemplateMethod)的定义模板方法模式是一种行为设计模式,它在超类中定义一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。模板是对多种事物的结......
  • MasaFramework入门第二篇,安装MasaFramework了解各个模板
    安装MasaFramework模板执行以下命令安装最新Masa的模板dotnetnew--installMasa.Template安装完成将出现四个模板MasaBlazorApp:MasaBlazorApp的模板创建的是......
  • 算法 -- 反转链表
    反转链表简单3K相关企业给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出......