基础算法之二分算法

前言

本次博客,将要介绍二分算法的基本原理以及如何使用,深入浅出

二分可以针对整型以及浮点型接下来对其讲解希望对小白有所帮助吧

整型的二分法

一般要在一个数组中猜出一个数是否存在我们可以遍历一遍整个数组,判断是否存在,

看看遍历的简单代码

#include<stdio.h>
int main()
{
int arr[]={5,6,8,1,2,3,10,20,50};
int find=1;
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if(arr[i]==find)
{
printf("找到了\n");
break;
}
}
return 0;
}

但是如果这个数组的数是有序的,从大到小或从小到大的话

比如 1 2 3 4 5 6 7 8 9 10

我们可以从中间的数开始与要查找的数相比

如果中间的数大于查找的数 那么要查找的数在整个数组的左边,那么右边的数可以摒弃,右边界往左一半

如果中间的数小于查找的数 那么查找的数在整个数组的右边,那么左边的数可以摒弃,左边界往右一半

最终 左边和右边会相等或者是左边会大于右边此时循环结束

当然有两种情况是因为二分的范围不同,按照数学的集合的概念可以是 左闭右闭 

也可以是左闭右开 以及左开右开

闭就是取得到,开就是取不到

前两种用的更多,最后一种比较少

我们现在举一个例子,模拟一下在一个有序数组里中查找数的过程,简单的画个图以便理解

下面的图是左闭右闭为例

 

接下来还是看代码吧

先敲个左闭右闭

//左闭右闭
int main()
{
	int arr[10] = { 5,9,10,20,30,99,123,145,199,200 };
	int find;
	printf("请输入要找到的数");
	scanf("%d", &find);
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0])-1;
	//这里必须要写等于,不写会错,很多人在这里会犯错
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] > find)//因为mid不等于find所以-1缩小范围
			right = mid - 1;
		else if (arr[mid] < find)
			left = mid + 1;
		else
		{
			printf("找到了该数的下标为%d", mid);
			break;//这里要写break不然是死循环
		}
	}
	if (left > right)
	printf("没找到\n");
	return 0;
}

注意左闭右闭是要取到left==right的值比如 如果循环中没有等号

当范围为[1,1]且要查找的数为 1时,此时就会出现找不到的bug

这个很重要

接下来可以写一写左闭右开,其实也差不多

看看

//左闭右开
int main()
{
	int arr[] = { 20,36,55,69,100,300,500,1000,1002,1225 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]);//这里取不到
	int find;
	printf("请输入要查找的数");
	scanf("%d", &find);
	while (left < right)//由于右边是取不到的所以不加等号
	{
		int mid = (left + right) / 2;
		if (arr[mid] > find)
			right = mid;//mid所指向的值不等于find,但是右边是开取不到的所以不减1
		else if (arr[mid] < find)
			left = mid + 1;//左边取得到 arr[mid]可以排除在外
		else
		{
			printf("找到了该数的下标为%d", mid);
			break;//不写可能死循环
		}
	}
	if (left >= right)
		printf("找不到\n");
	return 0;
}

这样我们就解决了,很多初学者不知道什么时候加一什么时候减一

非常nice

整型的二分到此就结束了

希望大家注意

1 二分是要有序的

2 二分可按区间判断左右边结束条件 以及调整方法

3找到后记得跳出循环

4注意它的时间复杂是log2n

浮点型的二分

浮点型的数据,在内存中往往是不精确的,那么为了解决这个问题,我们可以通过夹逼的方式

来处理问题

那么执行次数越多精确值越大,如果执行100次二分 那么就是2的100次方分之一的精确度

非常精确

此时的left right 代表的是这个数的范围,一直二分,每次将范围缩小二分之一,可以吧

比如

求一个数的立方根,并且精确到第6位小数

加设这个数的立方根的范围为-100~100

我们本次以此为例

通过浮点数的二分来解决问题,在此之前可以画图让大家了解

看代码吧

int main()
{
	double input;
	scanf("%lf", &input);
	double right=100;
	double left=-100;
	double ans = 0;
	for (int i = 0; i < 100; i++)
	{
		double mid = (right + left)/2;
		if (mid * mid * mid <= input)
			left = mid;
		else
			right = mid;
	}
	ans = left;
	printf("%lf", ans);
	return 0;
}

浮点数的精确除了直接使用for循环直接执行100外,也可以用right-left<精确度

比如保留6为小数就可以 right-left<1e-6

至此二分法的基础也算是讲解完了,这个算法还算是比较简单

还是要多多练习

祝大家开心,睡个好觉

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java面向对象编程

标题&#xff1a;Java面向对象编程 文章目录 标题&#xff1a;Java面向对象编程前言&#xff1a;面向对象的三条主线一、面向对象编程概述1.1 程序设计思路1.2 Java语言的基本元素&#xff1a;类和对象1.3 对象的内存解析 二、类的成员1—成员变量2.1 “变量”定义&分类2.2…

蓝桥杯备赛

关闭同步流&#xff1a; ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); 注意数据范围&#xff1a;数据范围较大时干脆所有变量类型都定义成longlong等。 stl&#xff1a; sort函数 时间复杂度为nlog(n); sort(数组指针&#xff0c;从指针开始多少个数&#xff0c;great…

如何辨别:DNS污染or DNS劫持?

DNS劫持和DNS污染的情况在互联网中并不少见&#xff0c;到底是出现了DNS污染还是DNS劫持。什么是DNS污染&#xff1f;什么是DNS劫持&#xff1f;我们该如何辨别DNS污染和DNS劫持&#xff1f; DNS劫持&#xff1a; DNS 劫持是指恶意攻击者通过非法手段篡改了网络中的 DNS 服务…

HTML快速入门

HTML简介 HTML&#xff08;超文本标记语言&#xff09;是一种用于创建网页和Web应用程序的标记语言。它由一系列标签组成&#xff0c;每个标签通过尖括号来定义&#xff0c;并用于标记文本、图像、链接和其他内容。HTML标签描述了网页中的信息结构和布局&#xff0c;并定义了文…

[MySQL数据库] 索引与事务

1. 索引 1.1 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针.可以对表中的一列或多列创建索引,并指定索引的类型&#xff0c;各类索引有各自的数据结构实现. 1.2 作用 数据库中的表、数据、索引之间的关系&#xff0c;类似于书架上的图书、书籍…

【Redis】面试题汇总

Redis什么是Redis、使用场景有哪些Redis 为什么这么快&#xff1f;Redis 数据类型及使用场景五种常见的 Redis 数据类型是怎么实现&#xff1f;Redis是单线程吗Redis 采用单线程为什么还这么快&#xff1f;Redis 如何实现数据不丢失&#xff1f;Redis 如何实现服务高可用&#…

【复习笔记】FreeRTOS(六) 队列操作

本文是FreeRTOS复习笔记的第六节&#xff0c;队列操作。 上一篇文章&#xff1a; 【复习笔记】FreeRTOS(五)时间片调度 文章目录 1.队列操作1.1.队列操作过程1.2.队列操作常用的API函数 二、实验设计三、测试例程四、实验效果 1.队列操作 队列是为了任务与任务、任务与中断之间…

极狐GitLab x LigaAI,AI 时代研发提效新范式

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 近日&#xff0c;极狐GitLab 和 LigaAI 宣布合作&#xff0c;双…

分布式锁设计

一、为什么需要分布式锁 1.1 单体项目同步实现 在单进程&#xff08;启动一个jvm&#xff09;的系统中&#xff0c;当存在多个线程可以同时改变某个变量&#xff08;可变共享变量&#xff09;时&#xff0c;就需要对变量或代码块做同步&#xff0c;使其在修改这种变量时能够线…

vue2中props属性设置一个对象或数组的默认值

在Vue.js中&#xff0c;如果您想要为一个props属性设置一个对象或数组的默认值&#xff0c;您应该使用一个函数来返回这个默认值。这是因为对象和数组是引用类型&#xff0c;直接将它们作为默认值可能会导致预设的默认值被所有实例共享&#xff0c;这不是我们想要的结果。 下面…

zabbix 自定义模板,邮件报警,代理服务器,自动发现与自动添加及snmp

目录 一. 自定义监控内容 1. 在客户端创建自定义 key 2. 在 web 页面创建自定义监控项模块 2.1 创建模板 2.2 创建应用集 2.3 创建监控项 2.4 创建触发器 2.5 创建图形 2.6 将主机与模板关联起来 登录测试 2.7 设置邮件报警 测试邮件报警 3. nginx 服务状况的检测…

Vue中SourceMap的使用方法详解

目录 一、概述 二、使用方法 三、生成SourceMap 四、优化 五、结语 一、概述 Vue.js是一套构建用户界面的渐进式框架&#xff0c;通过HTML模板或者直接写render函数可以快速开发单页应用。在开发过程中&#xff0c;很多时候我们需要调试代码&#xff0c;追踪错误。Vue官方…

Linux:调试器 - gdb

Linux&#xff1a;调试器 - gdb gbd基本概念gbd调试浏览断点运行变量 gbd基本概念 GDB (GNU Debugger) 是一个强大的命令行调试工具,用于调试各种编程语言(如C、C、Java、Python等)编写的程序。使用 gdb可以帮助开发人员更快地定位和修复程序中的缺陷,提高代码质量和开发效率。…

Python介绍(未完)

文章目录 Python 背景知识Python 是谁创造的&#xff1f;Python 可以用来干什么&#xff1f;Python 的优缺点 搭建 Python 环境安装 Python搭建 PyCharm 环境新工具到手&#xff0c;赶紧试试中文设置第一个Python程序 Python基础语法基础语法&#xff08;1&#xff09;常量和表…

Error : java 错误 : 不支持发行版本5 ( 完美解决)

解决方案 1. 原因 idea的默认配置JDK版本与当前项目所需版本不一样 方案一&#xff08;每一个项目可能都要配置一遍&#xff09; Ctrlshitalts 打开项目结构&#xff0c;设置项目所需的JDK版本&#xff0c;本项目需要JDK8 Modules的JDK版本为5&#xff0c;这时就会报Error …

最大公约数和最小公倍数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现最大公约数函数&#xff1b; int max(int x, int y) {//初始化变量值&#xff1b;int judge 1;//运算&#xff1b;judge x %…

Ubuntu 23.10.1 nginx源码安装

注&#xff1a;以下所有命令均在root管理员模式下&#xff0c;若不是&#xff0c;请在所有命令前加sudo 1、安装依赖库 1.1、安装gcc g的依赖库 apt-get install build-essential apt-get install libtool1.2、安装pcre依赖库 apt-get update apt-get install libpcre3 lib…

剑指Offer题目笔记33(并查集)

面试题116&#xff1a; 解决方案&#xff1a; ​ 一个班级可以包含一个或多个朋友圈&#xff0c;对应的图中可能包含一个或多个子图&#xff0c;每个朋友圈对应一个子图。因此&#xff0c;这个问题可以转化为如何求图中子图的数目。图的搜索算法可以用来计算图中子图的数目。扫…

企业Linux特殊权限位/为什么会存在SUID?/企业环境测试(原理剖析)-4989字解析

企业高薪思维&#xff1a; 坚持很难&#xff0c;优秀的人才是少数&#xff0c;很重要 坚持不下去&#xff0c;问自己想要什么&#xff1f; 问问自己想要好的生活状态&#xff1f;问自己有背景吗&#xff1f;你学历是亮点吗&#xff1f;有钱没&#xff0c;你也就是一般家庭&…

selenium 下载文件取消安全下载的方法

问题描述 我要从一个网站上下载文件&#xff0c;谷歌浏览器总是自动阻止下载&#xff0c;并询问我是否保留。 可是&#xff0c;我想要的是不要询问&#xff0c;默认下载即可。 运行环境 OS: macOSselenium: 4.19.0python: 3.10.11Chrome: 124.0.6367.62selenium chromedrive…
最新文章