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);elseConsole.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;// 如果目标值大于中间值,将左边界扩大为中间值的右边一位elseleft = mid + 1;}// 如果无法找到目标值,返回-1return -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是集合的大小。因此,它特别适用于大型数据集或需要频繁搜索的情况。

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

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

相关文章

【python】求矩阵的特征值和特征向量

使用np.linalg.eig同时求特征值和特征向量 import numpy as np#输入矩阵 A np.array([[1, 1/2, 1/6, 1/9],[2, 1, 1/3, 1/5],[6, 3,1,1/2],[9, 5,2,1]])#求解特征值和其对应的特征向量 eigval,eigvec np.linalg.eig(A) for i in range(len(eigval)):print(f特征值&#xff1a…

STM32学习笔记一——初识STM32

目录 一、什么是ARM 二. Cortex 内核 三.什么是STM32 四.STM32核心板原理图&#xff1a; 五.STM32的内部结构&#xff1a; 六.stm32系统结构简化图 STM32基本原理分析&#xff1a; 七.典型型号——STM32F103ZET6 stm32——32位单片机&#xff08;数据总线是32位的&am…

mysql学习打卡day19

今日成果&#xff1a; update invoices set payment_total invoice_total *0.5,payment_date due_date where invoice_id 1; -- 更新单行记录 update orders set comments 金牌顾客 where customer_id in (select customer_id from customers where points > 3000); --…

文献速递:人工智能医学影像分割--- 深度学习分割骨盆骨骼:大规模CT数据集和基线模型

文献速递&#xff1a;人工智能医学影像分割— 深度学习分割骨盆骨骼&#xff1a;大规模CT数据集和基线模型 我们为大家带来人工智能技术在医学影像分割上的应用文献。 人工智能在医学影像分析中发挥着至关重要的作用&#xff0c;尤其体现在图像分割技术上。这项技术的目的是准…

如何将抖音API应用于抖音视频的录制和上传

抖音API允许开发者进行二次开发&#xff0c;使得第三方应用程序可以与抖音进行交互。要将抖音API应用于抖音视频的录制和上传&#xff0c;你需要遵循以下步骤&#xff1a; 获取抖音API密钥&#xff1a;首先&#xff0c;你需要从抖音官网注册一个开发者账号&#xff0c;并创建一…

Golang 流媒体服务器lalserver使用指南

目录 安装 使用 1.推流 2.播放 官方地址 安装 1.下载源码 wget https://github.com/q191201771/lal/releases/download/v0.36.7/lal_v0.36.7_linux.zipunzip lal_v0.36.7_linux.zip cd lal_v0.36.7_linux 2.启动 ./bin/lalserver -c ./conf/lalserver.conf.json 使用 …

TDengine 签约海博思创,助力储能运维平台数据管理

随着储能产业步入快速发展期&#xff0c;各类储能电站快速建设投产&#xff0c;规模各异&#xff0c;场景不同。为了实现储能电站的高效监控和运维管理&#xff0c;储能运维管理平台成为不可或缺的工具。通过高效的集中控制手段&#xff0c;这些平台能够有效解决储能电站运维成…

浅谈直流电表在韩国充电桩生产厂家的应用

I.背景&#xff1a; 近几年为应对温室气体的排放导致的全球变暖、气候变化等问题,各大国纷纷对焦推进电动汽车&#xff0c;从而减少传统燃油汽车带来的大量温室气体排放。而推进新能源汽车的各项举措之中&#xff0c;充电桩的基础建设&#xff0c;又是其中的重中之重&#xff…

AR眼镜_ar智能眼镜显示方案|光学方案

AR眼镜是一种智能眼镜&#xff0c;能够将虚拟现实和现实世界相结合&#xff0c;使人们能够在日常生活中体验和参与虚拟现实。然而&#xff0c;AR智能眼镜的制造成本高&#xff0c;开发周期长。要实现AR眼镜的各项功能&#xff0c;需要良好的硬件条件&#xff0c;而AR智能眼镜的…

python18-Python的字符串序列相关方法

字符串本质上就是由多个字符组成的,因此程序允许通过索引来操作字符,比如获取指定索引处的字符,获取指定字符在字符串中的位置等。 Python字符串直接在方括号([])中使用索引即可获取对应的字符,字符串中第一个字符的索引为0、第二个字符的索引为1,后面各字符依此类推。 …

数据库管理-第138期 数据库国产化是Office换WPS么(20240124)

数据库管理138期 2024-01-24 第138期 数据库国产化是Office换WPS么&#xff08;20240124&#xff09;1 背景2 现实3 方法论总结 第138期 数据库国产化是Office换WPS么&#xff08;20240124&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle ACE…

ssl证书更换步骤及更换后有效期没有更新问题

因公司ssl证书到期&#xff0c;在阿里云申请免费证书更换后&#xff0c;查看证书有效期&#xff0c;发现有效期没有更新。 ssl证书更换步骤&#xff1a; 1.下载nginx证书文件 2.服务器上替换原有ssl证书&#xff08;操作前记得备份&#xff09; 3.更改nginx.conf文件中证书路径…

Python 一些常见的字符串操作

常见的字符串操作有&#xff1a; 创建字符串&#xff1a; # 使用单引号创建字符串 s1 Hello, World!# 使用双引号创建字符串 s2 "Python Programming"# 使用三引号创建多行字符串 s3 This is a multi-line string.访问字符串中的字符&#xff1a; s Hello, World…

聚势合力 共创高峰”2023思腾合力成都客户答谢会

聚势合力 共创高峰”为主题的思腾合力成都答谢会&#xff0c;在成都都江堰皇冠假日酒店盛大举行&#xff0c;来自各地的客户齐聚于此&#xff0c;共同见证思腾合力的成长与突破&#xff0c;展望未来的合作与发展。 思腾合力总经理王伟热情洋溢的致辞拉开活动序幕。他表达了对所…

业务逐字稿

1.WEB端旅游线路发布模块 旅游公司在Web端点击新增旅游线路按钮&#xff0c;浏览器请求发送到Nginx&#xff0c;Nginx反向代理到网关&#xff0c;网关去找微服务&#xff0c;微服务实现具体的旅游线路发布功能 旅游公司工作人员在Web端点击新增旅游线路按钮&#xff0c;浏览器…

wsl-ubuntu 安装 nginx

wsl-ubuntu 安装 nginx 1. 安装 nginx2. 确认 nginx 启动状态3. 重启 nginx4. 停止 nginx 1. 安装 nginx sudo apt install nginx2. 确认 nginx 启动状态 systemctl status nginx3. 重启 nginx systemctl restart nginx4. 停止 nginx systemctl stop nginx完成&#xff01;…

用友NC Cloud及YonBIP PMCloudDriveProjectStateServlet JNDI注入漏洞复现

0x01 产品简介 用友 NC Cloud 是一种商业级的企业资源规划云平台,为企业提供全面的管理解决方案,包括财务管理、采购管理、销售管理、人力资源管理等功能,基于云原生架构,深度应用新一代数字技术,打造开放、 互联、融合、智能的一体化云平台,支持公有云、混合云、专属云…

SpringBoot统一结果返回、异常处理

引言 在开发Spring Boot应用时,我们经常面临着不同的控制器方法需要处理各种不同类型的响应结果,以及在代码中分散处理异常可能导致项目难以维护的问题。你是否曾经遇到过在不同地方编写相似的返回格式,或者在处理异常时感到有些混乱?这些看似小问题的积累,实际上可能对项…

pve宿主机更改网络导致没网,pve更改ip

一、问题描述 快过年了&#xff0c;我把那台一直在用的小型服务器&#xff0c;带回去了&#xff0c;导致网络发生了变更&#xff0c;需要对网络进行调整&#xff0c;否则连不上网&#xff0c;我这里改的是宿主机&#xff0c;不是pve虚拟机中的系统。 二、解决方法 pve用的是…

[GN] 设计模式——面向对象设计原则概述

文章目录 面向对象设计原则概述单一职责原则开闭原则里氏代换原则依赖倒转原则接口隔离原则合成复用原则迪米特法则 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 面向对象设计原则概述 单一职责原则 一个类只负责一个功能领域中的相应职责 类…