【算法】二分查找(整数二分和浮点数二分)

news2024/11/24 12:48:01

二分查找也称折半查找(Binary Search),是一种效率较高的查找方法,时间复杂度O(logN)

二分查找采用了“分治”策略。使用二分查找时,数组中的元素之间得有单调性升序或者降序)。

二分的模板据我目前所知有三个,但是下面是我个人认为最好的一种(比较简单,不容易写错~)

1. 整数二分

整数二分过程:

 普遍规律:

 我们发现:

2. 整数二分模板

查找最后一个<=x的数的下标:

int find(int x)
{
	int l = 0, r = n + 1; //开区间
	while (l + 1 < r)  //l+1==r时结束
	{
		int mid = (l + r) >> 1;  //相当于mid=(l+r)/2;
		if (a[mid] <= x) l = mid;
		else r = mid;
	}
	return l;
}

查找第一个>=x的数的下标:

int find(int x)
{
	int l = 0, r = n + 1; //开区间
	while (l + 1 < r)  //l+1==r时结束
	{
		int mid = (l + r) >> 1;  //相当于mid=(l+r)/2;
		if (a[mid] >= x) r = mid;
		else l = mid;
	}
	return r;
}

3. 整数二分模板题

3.1 洛谷P2249 【深基13.例1】查找

原题链接:https://www.luogu.com.cn/problem/P2249

#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N], n, m;
int find(int x)
{
	int l = 0, r = n + 1;
	while (l + 1 < r)
	{
		int mid = (l + r) >> 1;
		if (a[mid] >= x) r = mid;
		else l = mid;
	}
	if (a[r] == x) return r;
	else return -1;
}
int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	while (m--)
	{
		int k;
		scanf("%d", &k);
		printf("%d ", find(k));
	}
	return 0;
}

 3.2 Acwing789. 数的范围

原题链接:https://www.acwing.com/problem/content/791/

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],n,q;
int find1(int x)
{
    int l=-1,r=n;
    while(l+1<r)
    {
        int mid=(l+r)>>1;
        if(a[mid]>=x) r=mid;
        else l=mid;
    }
    if(a[r]==x) return r;
    else return -1;
}
int find2(int x)
{
    int l=-1,r=n;
    while(l+1<r)
    {
        int mid=(l+r)>>1;
        if(a[mid]<=x) l=mid;
        else r=mid;
    }
    if(a[l]==x) return l;
    else return -1;
}
int main()
{
    scanf("%d%d",&n,&q);
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    while(q--)
    {
        int k;
        scanf("%d",&k);
        printf("%d %d\n",find1(k),find2(k));
    }
}

4. 浮点数二分

我们看下图:

分析:

(其实是个二分答案的题目)

y=x^3,我们知道这是个单调递增的函数。

-10000开三次方根大概是-27,10000开三次方根大概是27。

因为-10000<=y<=10000,我们为了方便,把左边界设置成-100,右边界设置成100。

 我们可以直观看到-27~27包含在-100~100。所以这样设置左右边界是没有问题滴。

我们不断二分缩小范围,当l和r非常接近时r-l<=1e-8),我们就认为找到了这个三次方根。

否则我们用while(r-l>=1e-8)继续循环遍历。

又因为是递增的,所以mid*mid*mid<=y,我们让区间往右靠l=mid);反之,当mid*mid*mid>y时,我们让区间往左靠r=mid)。

最后返回左边界l即可

 

5. 浮点数二分模板

double find(double y)
{
	double l = -100, r = 100;
	while (r - l > 1e-8)
	{
		double mid = (l + r) / 2;
		if (mid * mid * mid <= y) l = mid;
		else r = mid;
	}
	return l;
}

6. 浮点数二分模板题

6.1 Acwing 790.数的三次方根

原题链接:https://www.acwing.com/problem/content/792/

 

#include<bits/stdc++.h>
using namespace std;
double n;
int main()
{
	scanf("%lf", &n);
	double l = -100, r = 100;
	while (r - l > 1e-8)
	{
		double mid = (l + r) / 2;
		if (mid * mid * mid <= n) l = mid;
		else r = mid;
	}
	printf("%.6lf\n", r);
	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/904595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一题——螺旋矩阵

题目 给定一个m x n大小的矩阵&#xff08;m行&#xff0c;n列&#xff09;&#xff0c;按螺旋的顺序返回矩阵中的所有元素。 数据范围&#xff1a;0≤n,m≤10&#xff0c;矩阵中任意元素都满足 ∣val∣≤100 要求&#xff1a;空间复杂度 O(nm) &#xff0c;时间复杂度 O(nm)…

网络安全等级保护2.0

等保介绍 等保测评是为了符合国家法律发挥的需求&#xff0c;而不是安全认证&#xff08;ISO&#xff09; 一般情况没有高危安全风险一般可以通过&#xff0c;但若发现高位安全风险则一票否决 二级两年一次 三级等保测评每年一次 &#xff08;收费&#xff09; 四级每个年…

虚拟内存机制2

转载自公众号&#xff1a;在下小神仙 为什么要有虚拟内存机制&#xff1f; 在早期的计算机中&#xff0c;是没有虚拟内存的概念的。 我们要运行一个程序&#xff0c;会把程序全部装入内存&#xff0c;然后运行。 当运行多个程序时&#xff0c;经常会出现以下问题&#xff1a…

不使用导入表而直接调用dll中函数的病毒的工作方式

一、实验目的&#xff1a; 通过该实验&#xff0c; 使学生掌握使用PEB结构确定kernel32.dll基地址的方法与原理&#xff0c;通过对PE导出表结构分析来理解获取API函数地址的方法&#xff0c;最终通过编码完成一个没有导入表的测试程序。 二、实验步骤&#xff1a; 1.通过使用…

适用于 Windows 的 5 款最佳免费数据恢复软件

每个计算机用户都曾经历过数据丢失的情况。很容易错误地删除重要的文件和文件夹&#xff0c;当发生这种情况时&#xff0c;可能会导致不必要的心痛和压力。值得庆幸的是&#xff0c;可以恢复 Windows PC 上丢失的数据。在本文中&#xff0c;我们将分享您可以使用的五种最佳 Win…

第三讲:ApplicationContext的实现

这里写目录标题 一、前文回顾二、基础代码准备三、基于XML的ClassPathXmlApplicationContext1. 创建spring-config.xml配置文件2. 指定配置文件的路径 四、基于注解的AnnotationConfigApplicationContext1. 新增一个配置类2.指定配置类信息 五、基于注解和ServletWebServer应用…

剑指offer全集系列(1)

目录 JZ3 数组中重复的数字 JZ4 二维数组中的查找 JZ5 替换空格 JZ6 从尾到头打印链表 JZ18 删除链表的节点 JZ22 链表中倒数最后k个结点 题目为剑指offer top100题目, 欢迎大家来学习&#x1f618; JZ3 数组中重复的数字 数组中重复的数字_牛客题霸_牛客网在一个长度为…

centos7安装virtualbox

在线安装 vi /etc/yum.repos.d/virtualbox.repo&#xff0c;复制后将下面内容编辑保存。 [virtualbox] nameOracle Linux / RHEL / CentOS-$releasever / $basearch - VirtualBox baseurlhttp://download.virtualbox.org/virtualbox/rpm/el/$releasever/$basearch enabled1 …

DeFINE:用于神经序列建模的深度分解输入令牌嵌入

一、说明 DeFINE&#xff0c;是华盛顿大学和艾伦人工智能开发的自然语言处理工具&#xff0c;可以处理的范围是&#xff1a;NLP、语言模型、LM、神经机器翻译、NMT、变压器、变压器-XL等&#xff1b;本文对token-bedding进行生成。 借助DeFINE&#xff0c;Transformer-XL可以在…

RHCE——三、远程连接服务器

远程连接服务器 一、远程连接服务器1、概念2、功能3、分类文字接口图形接口 二、文字接口连接服务器:三、连接加密技术简介密钥解析 四、SSH工作过程1、版本协商阶段2、密钥和算法协商阶段3、认证阶段(两种认证方法) 五、SSH服务配置1、安装ssh2、配置文件分析 六、ssh实验1、实…

Linux系统简介

文章目录 1. UNIX与Linux发展史1.1 UNIX发展史1.2 Linux发展史1.2.1 Linux内核版本1.2.2 Linux主要发行版本 2. 开源软件简介2.1 典型的开源软件2.2 开源软件的特点2.3 支撑互联网的开源技术 3. Linux应用领域3.1 基于Linux的企业服务器3.2 嵌入式应用3.3 Linux在电影娱乐业 4.…

在线SHA1加密工具--在线获取哈希值又称摘要

具体请前往&#xff1a; 在线计算Sha1摘要工具

使用open cv进行角度测量

使用open cv进行角度测量 用了一点初中数学的知识&#xff0c;准确度&#xff0c;跟鼠标点的准不准有关系&#xff0c;话不多说直接上代码 import cv2 import mathpath "test.jpg" img cv2.imread(path) pointsList []def mousePoint(event, x, y, flags, param…

Python批量爬虫下载PDF文件代码实现

本文的背景是&#xff1a;大学关系很好的老师问我能不能把Excel中1000个超链接网址对应的pdf文档下载下来。虽然可以手动一个一个点击下载&#xff0c;但是这样太费人力和时间了。我想起了之前的爬虫经验&#xff0c;给老师分析了一下可行性&#xff0c;就动手实践了。    没…

第一讲:BeanFactory和ApplicationContext接口

BeanFactory和ApplicationContext接口 1. 什么是BeanFactory?2. BeanFactory能做什么&#xff1f;3.ApplicationContext对比BeanFactory的额外功能?3.1 MessageSource3.2 ResourcePatternResolver3.3 EnvironmentCapable3.4 ApplicationEventPublisher 4.总结 1. 什么是BeanF…

docker的资源控制及数据管理

docker的资源控制及docker数据管理 一.docker的资源控制 1.CPU 资源控制 1.1 资源控制工具 cgroups&#xff0c;是一个非常强大的linux内核工具&#xff0c;他不仅可以限制被 namespace 隔离起来的资源&#xff0c; 还可以为资源设置权重、计算使用量、操控进程启停等等。 …

面试汇总-testcase

朋友圈点赞的测试用例 功能测试 1点赞后是否显示结果 2.点赞后是否可以取消; 3.点赞取消后是否可以重复点赞; 4.共同好友点赞后&#xff0c;是否有消息提醒; 5.非共同好友点赞后&#xff0c;是否有消息提醒; 6.点击点赞人昵称&#xff0c;是否可以跳转到他/她的主页; 7.自己能…

对象头的结构

一、对象头的结构(32位虚拟机) 1、普通对象 普通对象头占用64 bits &#xff0c;其中Mark word占32 bits &#xff0c;Klass Words 占32bits。Klass Words 可以理解为指针&#xff0c;指向类对象。Mark Word下面会详解。 2、数组对象 数组对象增加了4个字节的空间&#xff0c;…

百度许少辉著Baidu《乡村振兴战略下传统村落文化旅游设计》图书馆新书通报

百度许少辉著Baidu《乡村振兴战略下传统村落文化旅游设计》图书馆新书通报