C# 二分搜索(Binary Search)

二分搜索概念

二分查找也称折半查找(Binary Search)它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

二分搜索的背景

二分搜索法的概念和思想可以追溯到古代的中国和埃及,

在中国,二分搜索法的原始形式被称为"二分查找",最早出现在公元3世纪的《张邱建算经》中。该算经描述了一种使用二分查找来求解方程的方法。

在埃及,大约在公元1世纪,亚历山大的希罗提米斯(Hero of Alexandria)使用二分法来求解方程和近似计算根号数的值。他的工作被收录在他的著作《机械术》中。

二分搜索应用场景

需要注意的是,二分搜索要求数据集必须是有序的,否则无法正确进行查找。因此,在应用场景中要确保数据的有序性。

二分搜索广泛应用于各种需要查找特定元素的场景,特别是在大规模数据集中进行查找时,可以大幅提高搜索效率。以下是一些常见的应用场景:

  1. 在有序数组中查找特定元素:由于有序数组的特性,二分搜索可以快速定位目标元素所在的位置。

  2. 在字典中查找单词:字典通常按照字母顺序排序,可以利用二分搜索来加快查找单词的速度。

  3. 在数据库索引中进行查找:数据库的索引通常采用有序结构,可以借助二分搜索来快速定位目标数据。

  4. 在游戏中的查找操作:例如在一副扑克牌中查找某张牌的位置,或在地图中查找某个地点的坐标等。

二分搜索的代码实现

   

static void Main(string[] args)
{
	int[] arr = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };

	int target = 12;
	int result = BinarySearchDemo.BinarySearch(arr, target);

	if (result != -1)
		Console.WriteLine("目标值 " + target + " 在数组中的索引位置为 " + result);
	else
		Console.WriteLine("目标值 " + target + " 不存在于数组中");

	Console.ReadLine();
}
public class BinarySearchDemo
{
	public static int BinarySearch(int[] arr, int target)
	{
		int left = 0;
		int right = arr.Length - 1;

		while (left <= right)
		{
			int mid = left + (right - left) / 2;

			// 检查目标值是否等于中间值
			if (arr[mid] == target)
				return mid;

			// 如果目标值小于中间值,将右边界缩小为中间值的左边一位
			if (arr[mid] > target)
				right = mid - 1;

			// 如果目标值大于中间值,将左边界扩大为中间值的右边一位
			else
				left = mid + 1;
		}

		// 如果无法找到目标值,返回-1
		return -1;
	}

	
}

代码输出结果:

代码解析:  

  我们使用两个指针 left 和 right 来表示搜索范围的左右边界。
在 while 循环中,我们计算中间值 mid,并检查目标值是否等于中间值。如果是,则返回中间值的索引。
如果目标值小于中间值,说明目标值可能在左半边。我们将右边界缩小为中间值的左边一位
如果目标值大于中间值,说明目标值可能在右半边。我们将左边界扩大为中间值的右边一位
如果无法找到目标值,即 left > right,则返回-1。

int[] arr = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };

C# int / int 会向下取整数,例如 9 / 2 = 4

例如我们找 12,数组的最大值下标是9,第一次,9 / 2 = 4,判断arr [4]为10,明显10<12,说明数据在右半段

接下来,需要用(4+1)+(9-4)/2=7,这样取到了右边的中间数 ,判断 arr [7]为12,程序结束

总结

     二分搜索算法的用途是在一个已排序的集合中高效地查找目标值。与线性搜索相比,二分搜索的时间复杂度为O(log n),其中n是集合的大小。因此,它特别适用于大型数据集或需要频繁搜索的情况。

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

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

相关文章

服务器遭遇CC攻击怎么办,使用高防SCDN能防御吗

随着互联网的普及&#xff0c;网络安全问题日益凸显&#xff0c;其中CC攻击&#xff08;也称为Challenge Collapsar攻击&#xff09;已成为一种常见的网络攻击手段。CC攻击主要针对服务器的验证码系统进行攻击&#xff0c;通过大量请求来耗尽服务器资源&#xff0c;导致服务器无…

14个国产AI大模型备案获批,众多科技巨头进入AIGC赛道

北京商报官网消息&#xff0c;第四范式、什么值得买、新壹科技、衔远科技、小米、智联招聘、Boss直聘、脉脉等13家企业的&#xff0c;14个国产AI大模型通过《生成式人工智能服务管理暂行办法》备案&#xff0c;可实现商业化应用。 自2023年8月&#xff0c;文心一言、讯飞星火、…

论文笔记:多任务学习模型:渐进式分层提取(PLE)含pytorch实现

整理了RecSys2020 Progressive Layered Extraction : A Novel Multi-Task Learning Model for Personalized Recommendations&#xff09;论文的阅读笔记 背景模型代码 论文地址&#xff1a;PLE 背景 多任务学习&#xff08;multi-task learning&#xff0c;MTL&#xff09;&a…

京东广告算法架构体系建设--在线模型系统分布式异构计算演变 | 京东零售广告技术团队

一、现状介绍 算法策略在广告行业中起着重要的作用&#xff0c;它可以帮助广告主和广告平台更好地理解用户行为和兴趣&#xff0c;从而优化广告投放策略&#xff0c;提高广告点击率和转化率。模型系统作为承载算法策略的载体&#xff0c;目前承载搜索、推荐、首焦、站外等众多广…

2024 新年HTML5+Canvas制作3D烟花特效(附源码)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

Demo: 前端生成条形码并打印

前端生成条形码并打印 安装依赖&#xff1a; npm i print-js // 打印 npm i jsbarcode // 生成条形码 <template><div id"printContent" style"display: none;"><div id"elTable"><div class"name">名称&…

解决import Jetson.GPIO报错“权限错误”

在导入Jetson.GPIO模块时出现权限错误&#xff0c;可能是由于缺少适当的权限或设备权限问题。以下是一些建议&#xff1a; 使用sudo&#xff1a; 尝试使用sudo来运行你的Python脚本或解释器&#xff0c;以获取足够的权限&#xff1a; sudo python your_script.py请注意&#xf…

春节运维手册:自动巡检、应急预案和管家值守哪个更香?

春节假期就要来啦&#xff0c;在气氛组的不懈努力下&#xff0c;想要放假过年的心达到了顶峰&#xff0c;但总有工作离不开我&#xff0c;回家后还被Q&#xff0c;总不能视而不见吧&#xff1f;想要get不被工作打扰的假期&#xff0c;作为资深运维工程师&#xff0c;怎么可能没…

Easy-Es操作Elasticsearch

文章目录 1 Easy-Es1.1 简介1.2 MySQL与Easy-Es语法对比1.3 集成及配置1.3.1 pom.xml1.3.2 配置 1.4 使用1.4.1 注解的使用1.4.2 EsMapper接口1.4.3 简单搜索 1.5 使用案例1.5.1 综合商品搜索1.5.2 相关商品推荐1.5.3 聚合搜索商品相关信息 1 Easy-Es 使用过Spring Data操作ES…

图灵之旅--ArrayList顺序表LinkedList链表栈Stack队列Queue

目录 线性表顺序表ArrayList简介ArrayList使用ArrayList的构造ArrayList常见操作ArrayList的遍历ArrayList的扩容机制利用ArrayList洗牌ArrayList的优缺点 链表链表的实现双向链表的实现 LinkedListLinkedList引入LinkedList的使用LinkedList的构造LinkedList的常用方法介绍Lin…

优质硬盘检测工具SMART Utility,保障您的Mac数据安全

在日常使用Mac电脑的过程中&#xff0c;我们经常会存储大量的重要数据&#xff0c;如照片、文档、视频等。然而&#xff0c;硬盘故障却是一件令人头疼的事情&#xff0c;可能会导致数据丢失、系统崩溃等严重后果。为了保障您的数据安全&#xff0c;我们推荐一款专业的硬盘检测工…

260:vue+openlayers 通过webgl方式加载矢量图层

第260个 点击查看专栏目录 本示例介绍如何在vue+openlayers中通过webgl方式加载矢量图层。在做这个示例的时候,采用vite的方式而非webpack的方式。这里的基础设置需要改变一下。 ol的版本7.5.2或者更高。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文…

matlab appdesigner系列-仪器仪表4-开关、开关(切换)、开关(翘板)

开关、开关&#xff08;切换&#xff09;、开关&#xff08;翘板&#xff09;&#xff0c;可进行On和Off两种状态切换 示例&#xff1a;开关开启时&#xff0c;可通过滑块调整表盘数值&#xff0c;并有提示框提示 开关关闭时&#xff0c;滑块、表盘数值清零&#xff0c;并有提…

30s学会JAVA几个关键词

1.final&#xff08;最终&#xff09; 修饰类-》此类无法被继承 修饰方法-》该方法不可被重写 修饰属性和局部变量-》看作常量&#xff0c;赋值位置&#xff1a;显式初始化&#xff0c;代码块初始化&#xff0c;构造器初始化 2.super(继承子类可用) 1.在子类方法或构造器中…

CentOS网络配置进阶:深入研究network服务和NetworkManager

前言 如果你正在使用CentOS系统,并且想要深入了解网络管理和配置,那么本文肯定适合你!在这篇文章中,作者深入探讨了CentOS中的两种网络管理方式:network服务和NetworkManager。通过详实的讲解和实用的示例,你将会学习到如何使用这两种工具来管理网络接口、配置IP地址、网…

故障诊断 | 一文解决,LSTM长短期记忆神经网络故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现LSTM长短期记忆神经网络故障诊断 专栏介绍 订阅【故障诊断】专栏,不定期更新机器学习和深度学习在故障诊断中的应用;订阅

Enzo Life Sciences:NUCLEAR-ID®系列染料

Enzo Life Sciences公司的NUCLEAR-ID Blue DNA stain (GFP-CERTIFIED)和NUCLEAR-ID Red DNA Stain是细胞渗透性染料&#xff0c;适用于活细胞的细胞核染色。这系列染料为通过流式细胞术研究细胞周期进程的诱导和抑制提供了一种简便方法。该试剂在活细胞研究中的潜在应用包括确…

UI动效如何通过ps放到贴图模板里导出gif效果图

经常看到设计网站上有将UI动效在好看的模板里进行展示的&#xff0c;效果非常棒&#xff01;很多设计师应该都可以做出好看的UI动效动画效果&#xff0c;但不知道怎么把动效放到手机模板里进行更好的展示。 这篇教程就是帮你把制作好的动效动画通过ps放到好看的模板里&#xf…

负载均衡下Webshell连接思路及难点

君衍. 一、应用场景二、环境搭建三、思路以及难点1、查看内部结构2、查看webshell3、使用蚁剑进行连接4、难点1 shell文件上传问题5、难点2 命令执行时飘逸6、难点3 大工具上传失败7、难点4 脚本失效 四、解决方式1、关闭对方节点服务器2、基于IP地址判断是否执行3、脚本实现流…

【重磅发布】已开放!模型师入驻、转格式再升级、3D展示框架全新玩法…

1月23日&#xff0c;老子云正式发布全新版本。此次新版本包含多板块功能上线和升级&#xff0c;为用户带来了含模型师入驻、三维格式在线转换升级、模型免费增值权益开放、全新3D展示框架等一系列精彩内容&#xff01; 1月23日&#xff0c;老子云正式发布全新版本。此次新版本…