理解折半查找法

理解折半查找法:高效的查找算法

在这里插入图片描述

折半查找法(又称二分查找法)是一种高效的查找算法,用于查找一个已排序数组中的目标元素。与线性查找方法不同,折半查找每次都将搜索范围减半,从而大幅提升查找效率。本文将详细分析折半查找的工作原理,并以查找目标值 13 为例进行内存分析。

折半查找法的基本原理

折半查找法基于这样一个假设:目标数据已经排好序。该算法通过不断地将查找范围一分为二,逐步缩小查找范围,从而在较短的时间内找到目标元素。具体步骤如下:

  1. 初始化:设定一个查找范围,包括 leftright,分别代表数组的起始索引和结束索引。
  2. 计算中间元素:每次计算中间元素的位置,mid = left + (right - left) / 2,并与目标值进行比较。
  3. 缩小查找范围
    • 如果目标值等于中间元素,返回该元素的索引。
    • 如果目标值小于中间元素,说明目标值在左半部分,将 right 设置为 mid - 1
    • 如果目标值大于中间元素,说明目标值在右半部分,将 left 设置为 mid + 1
  4. 循环:重复上述步骤,直到找到目标元素或查找范围为空(left > right)。

折半查找法的时间复杂度

折半查找的时间复杂度是 (O(\log n)),其中 n 是数组的大小。每次比较都会将查找范围减半,因此不需要遍历整个数组。相比于线性查找的 (O(n)),折半查找法的效率要高得多,尤其是在数据量较大的情况下。

源代码实现

下面是实现折半查找的 C++ 代码:

#include <iostream>
using namespace std;// 折半查找函数,返回目标值的索引,找不到返回 -1
int binarySearch(int arr[], int size, int target) {int left = 0;int right = size - 1;while (left <= right) {int mid = left + (right - left) / 2; // 防止溢出// 检查中间元素是否是目标值if (arr[mid] == target) {return mid; // 找到目标,返回索引}// 如果目标值小于中间元素,缩小右边界else if (arr[mid] > target) {right = mid - 1;}// 如果目标值大于中间元素,缩小左边界else {left = mid + 1;}}return -1; // 目标值不在数组中
}int main() {int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}; // 必须是有序数组int size = sizeof(arr) / sizeof(arr[0]);int target;cout << "Enter the number to search: ";cin >> target;int result = binarySearch(arr, size, target);if (result != -1) {cout << "Found " << target << " at index " << result << endl;} else {cout << target << " is not in the array." << endl;}return 0;
}

以查找目标值 13 为例

假设我们有一个有序数组 arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19},并且我们的目标值是 13,我们将在数组中查找目标值。

初始设置:

  • 数组 arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
  • 目标值 target = 13
  • 数组大小 size = 10,即 arr 的长度。
  • 初始值:left = 0right = 9

1. 第一次迭代

  • left = 0, right = 9
  • 计算中间索引 mid = 0 + (9 - 0) / 2 = 4,即 mid = 4
  • 访问 arr[mid],即 arr[4] = 9

比较 arr[mid] 与目标值 target

  • arr[mid] = 9,目标值 13 大于 9,因此目标值在右侧。

更新 left = mid + 1 = 4 + 1 = 5,新的查找区间是 [5, 9]

2. 第二次迭代

  • left = 5, right = 9
  • 计算中间索引 mid = 5 + (9 - 5) / 2 = 7,即 mid = 7
  • 访问 arr[mid],即 arr[7] = 15

比较 arr[mid] 与目标值 target

  • arr[mid] = 15,目标值 13 小于 15,因此目标值在左侧。

更新 right = mid - 1 = 7 - 1 = 6,新的查找区间是 [5, 6]

3. 第三次迭代

  • left = 5, right = 6
  • 计算中间索引 mid = 5 + (6 - 5) / 2 = 5,即 mid = 5
  • 访问 arr[mid],即 arr[5] = 11

比较 arr[mid] 与目标值 target

  • arr[mid] = 11,目标值 13 大于 11,因此目标值在右侧。

更新 left = mid + 1 = 5 + 1 = 6,新的查找区间是 [6, 6]

4. 第四次迭代

  • left = 6, right = 6
  • 计算中间索引 mid = 6 + (6 - 6) / 2 = 6,即 mid = 6
  • 访问 arr[mid],即 arr[6] = 13

比较 arr[mid] 与目标值 target

  • arr[mid] = 13,目标值 13 相等,查找成功。

返回索引 6,即目标值 13 的位置。

内存分析

每次迭代,程序都会读取 arr[mid] 并进行比较。内存访问是按需进行的,程序仅读取当前中间位置的值,而不是遍历整个数组。每次查找范围缩小后,leftright 指针更新,从而减少了对内存的访问。通过每次将查找范围缩小一半,折半查找能够快速找到目标值,避免了不必要的内存读取。

总结

折半查找法通过每次将查找范围缩小一半,显著提高了查找效率。在有序数组中,我们能够在 (O(\log n)) 的时间复杂度内查找到目标元素。每次对数组元素的访问都是必要的,避免了线性查找中的不必要访问,使得内存访问更加高效。对于大规模数据集,折半查找法是一种理想的查找方法。

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

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

相关文章

VM虚拟机装MAC后无法联网,如何解决?

✨在vm虚拟机上&#xff0c;给虚拟机MacOS设置网络适配器。选择NAT模式用于共享主机的IP地址 ✨在MacOS设置中设置网络 以太网 使用DHCP ✨回到本地电脑上&#xff0c;打开 服务&#xff0c;找到VMware DHCP和VMware NAT&#xff0c;把这两个服务打开&#xff0c;专一般问题就…

力扣 LeetCode 236. 二叉树的最近公共祖先(Day10:二叉树)

解题思路&#xff1a; 后序遍历 注意&#xff1a; p和q其中一个就是它们的公共祖先的情况也考虑到了&#xff0c;假设q是公共祖先&#xff0c;遇到q就直接返回&#xff0c;相当于是下面一边为空&#xff0c;一边不为空的情况&#xff0c;返回不为空就一边即可 class Solutio…

前端速通(HTML)

1. HTML HTML基础&#xff1a; 什么是HTML&#xff1f; 超文本&#xff1a; "超文本"是指通过链接连接不同网页或资源的能力。HTML支持通过<a>标签创建超链接&#xff0c;方便用户从一个页面跳转到另一个页面。 标记语言&#xff1a; HTML使用一组预定义的标签…

论文阅读——Performance Evaluation of Passive Tag to Tag Communications(一)

文章目录 摘要一、互耦对监听器标签输入阻抗的影响A. 无限细偶极子互阻抗的理论研究B. 电细偶极子的情况&#xff1a;理论与模拟C. 印刷偶极子的情况&#xff1a;电磁模拟与测量 二、T2T 通信系统的性能评估总结 论文来源&#xff1a;https://ieeexplore.ieee.org/document/970…

Palo Alto Networks PAN-OS身份认证绕过漏洞复现(CVE-2024-0012)

0x01 产品描述: PAN-OS 是运行 Palo Alto Networks 下一代防火墙的软件。通过利用 PAN-OS 本机内置的关键技术(App-ID、Content-ID、设备 ID 和用户 ID),可以在任何时间、任何地点完全了解和控制所有用户和设备中正在使用的应用程序。0x02 漏洞描述: PAN-OS 设备管理 Web …

使用ENSP实现静态路由

一、双路由器静态路由 1.项目拓扑 2.项目实现 (1)路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为1.1.1.1/24 ip address 1.1.1.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为192.168.1.1/24 ip ad…

Claude3.5-Sonnet和GPT-4o怎么选(附使用链接)

随着人工智能模型的不断进化&#xff0c;传统的评估标准已经逐渐变得陈旧和不再适用。以经典的“喝水测试”为例&#xff0c;过去广泛应用于检测模型能力&#xff0c;但现如今即便是国内的一些先进模型&#xff0c;也能够轻松答对这些简单的问题。因此&#xff0c;我们亟需引入…

uniapp+vue3+ts H5端使用Quill富文本插件以及解决上传图片反显的问题

uniappvue3ts H5端使用Quill富文本插件以及解决上传图片反显的问题 1.在项目中安装Quill npm i quill1.3.72.需要显示富文本的页面完整代码 <template><view><div ref"quillEditor" style"height: 65vh"></div></view> &…

QML —— 3种等待指示控件(附源码)

效果如下 说明 BusyIndicator应用于指示在加载内容或UI被阻止等待资源可用时的活动。BusyIndicator类似于一个不确定的ProgressBar。两者都可以用来指示背景活动。主要区别在于视觉效果,ProgressBar还可以显示具体的进度(当可以确定时)。由于视觉差异,繁忙指示器和不确定的…

数字后端零基础入门系列 | Innovus零基础LAB学习Day11(Function ECO流程)

###LAB 20 Engineering Change Orders (ECO) 这个章节的学习目标是学习数字IC后端实现innovus中的一种做function eco的flow。对于初学者&#xff0c;如果前面的lab还没掌握好的&#xff0c;可以直接跳过这节内容。有时间的同学&#xff0c;可以熟悉掌握下这个flow。 数字后端…

R语言绘图过程中遇到图例的图块中出现字符“a“的解决方法

R语言绘图过程中遇到图例的图块中出现字符的解决方法 因为我遇到这个问题的时候没在网上找到合适的方法&#xff0c;找到个需要付费的&#xff0c;算了。也许是因为问的方式不同&#xff0c;问了半天AI也回答出来&#xff0c;莫名有些烦躁&#xff0c;打算对代码做个分析&…

云服务器部署WebSocket项目

WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;其设计的目的是在Web浏览器和Web服务器之间进行实时通信&#xff08;实时Web&#xff09; WebSocket协议的优点包括&#xff1a; 1. 更高效的网络利用率&#xff1a;与HTTP相比&#xff0c;WebSocket的握手只…

数字反向输出

数字反向输出 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 小明听到广播里的数字后&#xff0c;总喜欢反着念给妈妈听。请聪明的你将小明听到的数字反向输出。 输入 输入为一个整型的四位数n 输出 …

2024-11-19 kron积

若A[a11 a12; a21 a22]; B[b11 b12; b21 b22]; 则C[a11*b11 a12*b11 a21*b11 a22*b11; a11*b12 a12*b12 a21*b12 a22*b12; a11*b21 a12*b21 a21*b21 a22*b21; a11*b22 a12*b22 a21*b22 a22*b22] 用MATLAB实现 方法1&#xff1a; A [a11 a12; a21 a22]; B [b11 b12; b21 b22]…

Java多态的优势和弊端

1. public class text {public static void main(String[] args) {animal dnew dog();d.eat();// dog a (dog) d;//类似强制转换//a.lookhome();/* if(d instanceof dog){dog a(dog)d;a.lookhome();}else if(d instanceof cat){cat c(cat) d;c.work();}else{System.out.print…

Chrome 浏览器 131 版本开发者工具(DevTools)更新内容

Chrome 浏览器 131 版本开发者工具&#xff08;DevTools&#xff09;更新内容 一、使用 Gemini 调试 CSS Chrome DevTools 现在推出了一个新的实验性 AI 辅助面板&#xff0c;可以与 Gemini 聊天并获得帮助来调试 CSS。 在 Elements 面板中&#xff0c;右键点击一个元素并选…

嵌入式工程师面试笔试总结——day1

第一章、进程与线程 1、什么是进程、线程&#xff0c;有什么区别&#xff1f; 进程是资源&#xff08; CPU 、内存等&#xff09;分配的基本单位&#xff0c;线程是 CPU 调度和分配的基本单位&#xff08;程序执行的最小单 位&#xff09;。同一时间&#xff0c;如果CPU 是单…

数据库表设计范式

华子目录 MYSQL库表设计&#xff1a;范式第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式&#xff08;3NF&#xff09;三范式小结巴斯-科德范式&#xff08;BCNF&#xff09;第四范式&#xff08;4NF&#xff09;第五范式&#xff08;5NF&…

提成制是什么?如何高效管理提成制?

提成工资制即将企业盈利按照一定的比例在企业和员工之间分成的方式&#xff0c;这种方式具有一定的激励性。实行提成制首先要确定合适的提成指标&#xff0c;一般是按照业务量或销售额提成&#xff0c;即多卖多得。 对于提成制来说&#xff0c;确定合适的提成方式和比例是非常重…

VPN技术-IPSec VPN概述学习笔记

企业对网络安全性的需求日益提升&#xff0c;而传统的TCPЛIP协议缺乏有效的安全认证和保密机制。IPSec(Internet Protocol Security)作为一种开放标准的安全框架结构&#xff0c;可以用来保证IP数据报文在网络上传输的机密性、完整性和防重放。 IPsec VPN&#xff08;Interne…