二分查找(红绿标记法)

文章目录

  • 1.线性查找
  • 2.二分查找
    • 2.1一般的二分查找
    • 2.2特殊的二分查找——红绿标记法
    • 2.3 原理解释:
    • 2.4 代码中的应用:

1.线性查找

线性查找(Linear Search)是一种简单直观的搜索算法,用于在数组中查找特定值的位置。它的基本思想是逐个检查数组中的每个元素,直到找到目标元素或者遍历完整个数组。
下面是线性查找的基本实现步骤:

  1. 遍历数组:从数组的第一个元素开始,逐个检查每个元素。
  2. 比较目标值:将当前元素与目标值进行比较。
  3. 找到目标:如果找到目标值,返回当前元素的索引。
  4. 未找到目标:如果遍历完整个数组都没有找到目标值,返回一个指定的表示未找到的值(例如 -1)。
    下面是一个简单的 C 语言实现示例,展示了如何使用线性查找在数组中查找特定的目标值:
#include <stdio.h>
// 线性查找函数,返回目标值在数组中的索引,如果找不到则返回 -1
int linearSearch(int arr[], int n, int target) {for (int i = 0; i < n; i++) {if (arr[i] == target) {return i;  // 找到目标值,返回索引 i}}return -1;  // 没有找到目标值,返回 -1
}
int main() {int arr[] = {23, 4, 16, 42, 8, 15};int n = sizeof(arr) / sizeof(arr[0]);int target = 42;int result = linearSearch(arr, n, target);if (result != -1) {printf("目标值 %d 找到在数组中的索引为 %d\n", target, result);} else {printf("目标值 %d 在数组中未找到\n", target);} return 0;
}

解释代码细节

  • linearSearch 函数接受三个参数:arr(待查找的数组),n(数组的大小),target(要查找的目标值)。
  • 函数使用 for 循环遍历数组 arr 中的每个元素。
  • 在循环体中,使用 if 条件语句检查当前元素 arr[i] 是否等于目标值 target
  • 如果找到目标值,则立即返回当前元素的索引 i
  • 如果遍历完整个数组都没有找到目标值,则返回 -1 表示未找到。

2.二分查找

2.1一般的二分查找

二分查找(Binary Search)是一种高效的搜索算法,适用于已经排好序的数组。它的基本思想是通过将目标值与数组中间元素进行比较,从而排除一半的数据,从而快速缩小搜索范围。
二分查找的步骤

  1. 初始化:确定数组的左右边界,通常左边界为 left = 0,右边界为 right = n - 1,其中 n 是数组的长度。
  2. 循环条件:只要 left 小于等于 right,就继续查找。
  3. 中间元素:计算中间元素的索引 mid,一般为 mid = (left + right) / 2
  4. 比较目标值
    • 如果目标值等于 arr[mid],则找到目标,返回 mid
    • 如果目标值小于 arr[mid],则在左半部分继续查找,更新 right = mid - 1
    • 如果目标值大于 arr[mid],则在右半部分继续查找,更新 left = mid + 1
  5. 未找到目标:如果循环结束时仍未找到目标值,则表示数组中不存在该值,返回 -1 或者其他指定的未找到标志。

2.2特殊的二分查找——红绿标记法

但是,在这里,我打算介绍一种新型的二分查找方法——红绿标记法

#include <stdio.h>// 函数声明
int findMinGreenIndex(int nums[], int n, int target);
int isGreen(int num, int target);// 寻找第一个大于等于 target 的元素的索引
int findMinGreenIndex(int nums[], int n, int target) {int red = -1;int green = n;int mid = 0;while (red + 1 < green) {mid = (red + green) / 2;if (isGreen(nums[mid], target)) {green = mid;} else {red = mid;}}return green;
}// 判断是否大于等于 target
int isGreen(int num, int target) {return num >= target;
}int main(void) {int nums[5] = {1, 2, 3, 4, 5};int number = findMinGreenIndex(nums, 5, 3);printf("%d\n", number); // 输出应该是 2return 0;
}

2.3 原理解释:

  1. 定义变量

    • red:初始为-1,表示小于目标值的范围的右边界。
    • green:初始为n,表示大于等于目标值的范围的左边界。
    • mid:中间位置的索引。
  2. 循环条件:

    • 当 red + 1 < green 时,表示范围内还有元素未处理。
  3. 计算中间位置 mid

    • mid = (red + green) / 2,计算中间索引位置。
  4. 判断条件:

    • 调用 isGreen(nums[mid], target) 函数,判断 nums[mid] 是否大于等于 target
    • 如果是,则将 green 缩小到 mid,因为我们要找的是第一个大于等于 target 的元素,可能还有更小的索引满足条件,所以缩小搜索范围到左侧。
    • 如果不是,则将 red 扩展到 mid,因为 nums[mid] 小于 target,所以将搜索范围缩小到右侧。
  5. 返回结果:

    • 当循环结束时,返回 green,即找到的第一个大于等于 target 的元素的索引。

2.4 代码中的应用:

  • 在 main 函数中,数组 nums 中有序地存储了 {1, 2, 3, 4, 5}
  • 调用 findMinGreenIndex(nums, 5, 3),期望找到大于等于 3 的第一个元素的索引。
  • 在这个例子中,3 在数组中的索引为 2,因此输出结果应为 2
    这种红绿标记法的优点在于,它通过修改搜索范围的两个边界 redgreen,在每次迭代中都将搜索范围缩小一半,因此时间复杂度为 O(log n),非常高效地找到符合条件的索引。

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

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

相关文章

DBeaver安装教程(开发人员和数据库管理员通用数据库管理工具)

前言 DBeaver 是一个通用的数据库管理工具和 SQL 客户端&#xff0c;支持 MySQL, PostgreSQL, Oracle, DB2, MSSQL, Sybase, Mimer, HSQLDB, Derby, 以及其他兼容 JDBC 的数据库。DBeaver 提供一个图形界面用来查看数据库结构、执行SQL查询和脚本&#xff0c;浏览和导出数据&a…

GEE代码实例教程详解:降水量分类分析

简介 在本篇博客中&#xff0c;我们将使用Google Earth Engine (GEE) 对特定区域内的降水量进行分类分析。通过设定不同的降水量阈值&#xff0c;我们可以将降水量分为干旱、中等和湿润三个类别&#xff0c;并分析这些类别随时间的变化。 背景知识 降水量分类 降水量分类是…

无损音频格式 FLAC 转 MP3 音频图文教程

音频文件的格式多样&#xff0c;每种格式都有其独特的特点与适用场景。FLAC&#xff08;Free Lossless Audio Codec&#xff09;&#xff0c;作为一种无损音频压缩格式&#xff0c;因其能够完美保留原始音频数据的每一个细节而备受音频发烧友和专业人士的青睐。 然而&#xff0…

NuGet 中国国内镜像

有时候网络不好&#xff0c;需要使用国内的一些镜像源。 华为资源&#xff1a; https://repo.huaweicloud.com/repository/nuget/v3/index.json 腾讯资源&#xff1a; https://mirrors.cloud.tencent.com/nuget/ 微软中国镜像源&#xff1a;https://nuget.cdn.azure.cn/v3…

仪表板展示|DataEase看中国:2023年中国新能源汽车经济运行情况分析

背景介绍 随着政府机构、企业和个人对环保和可持续发展的高度关注&#xff0c;“新能源汽车”在全球范围内成为了一个热门话题。新能源汽车是指使用非传统燃料&#xff08;如电能、氢能等&#xff09;作为动力源的汽车。 在中国市场&#xff0c;新能源汽车产业蓬勃发展&#…

SpringSecurity中文文档(Domain Object Security (ACLs))

Domain Object Security (ACLs) 本节描述 SpringSecurity 如何使用访问控制列表(ACL)提供域对象安全性。 复杂的应用程序通常需要定义超出 Web 请求或方法调用级别的访问权限。相反&#xff0c;安全决策需要包括 who (Authentication)、 where (MethodInvation)和 what (Some…

form原生表单以及el-from表单阻止表单默认提交事件,上传文件自动提交刷新以及input输入框按下enter键自动搜索的事件

问题&#xff1a; 1.form原生表单以及el-from表单阻止表单默认提交事件 2.上传文件自动提交刷新 3.只有一个input输入框按下enter键自动搜索提交的事件 解决方案&#xff1a; 1.el-form使用submit.native.prevent 2.form表单使用οnsubmit"return false"

如何切换手机的ip地址

在数字时代的浪潮中&#xff0c;智能手机已成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着网络安全问题的日益凸显&#xff0c;保护个人隐私和数据安全变得尤为重要。其中&#xff0c;IP地址作为网络身份的重要标识&#xff0c;其安全性与隐私性备受关注。本文将详…

智谱AI开源代码生成大模型 CodeGeeX4-ALL-9B

智谱AI 旗下的代码生成大模型 CodeGeeX 正式发布第四代开源版本&#xff1a;CodeGeeX4-ALL-9B&#xff0c;其是集代码补全和生成、代码问答、代码解释器、工具调用、联网搜索、项目级代码问答等能力于一体的代码大模型&#xff0c;是目前百亿&#xff08;10B&#xff09;参数以…

打开 Windows 磁盘管理程序的不同方法总结

如何打开磁盘管理 Windows 怎么打开磁盘管理呢&#xff1f;下面总结了几种不同的方法用来打开磁盘管理。 快速访问菜单 我们可以使用快捷键“WinX”或者将鼠标移动到开始菜单位置右键&#xff0c;这样就可以打开快速访问菜单&#xff0c;然后选择磁盘管理即可打开程序。 运行…

浅谈VPS主机上的数据库性能优化

如何提高网站性能&#xff1f;一个显而易见的解决方案是升级托管账户。您的网站将拥有更多硬件资源&#xff0c;因此可以同时处理更多请求并更快地传递数据。 无论如何&#xff0c;人们都是这么认为的。但事实总是不一样。 现代网站是一个复杂的系统&#xff0c;包含许多必须…

c++ primer plus 第15章友,异常和其他:异常,15.3.3 异常机制

#c primer plus 第15章友&#xff0c;异常和其他&#xff1a;异常,15.3.3 异常机制 异常,15.3.3 异常机制 文章目录 15.3.3 异常机制15.3.3 异常机制程序清单 15.9error3.cpp15.3.4 将对象用作异常类型程序清单15.10exc mean.h程序清单 15.11error4.cpp 15.3.3 异常机制 15.3.…

【STM32标准库】DMA双缓冲模式

1.双缓冲模式简介 设置DMA_SxCR寄存器的DBM位为1可启动双缓冲传输模式&#xff0c;并自动激活循环模式&#xff0c;所以设置普通模式或者循环模式都可以。 双缓冲不应用与存储器到存储器的传输。可以应用在从存储器到外设或者外设到存储器。 双缓冲模式下&#xff0c; 两个存…

IC认证介绍

IC认证是什么&#xff1f; IC是加拿大工业部Industry Canada的简称&#xff0c;作为政府机构&#xff0c;负责电子电器产品进入加拿大市场的认证事务。与美国的FCC相似&#xff0c;IC目前只在电磁干扰上做限制。一般规定&#xff1a;仅限制EMI&#xff0c;认证方式也与FCC相同…

vue3 身份证校验、识别性别/生日/年龄

表单项绑定 change 事件 <template><el-form ref"employeeFormRef" :model"form" :rules"rules" label-width"120px"><el-form-item label"身份证号" prop"idCardNo"><el-input v-model&qu…

领略超越王勃的AI颂扬艺术:一睹其惊艳夸赞风采

今日&#xff0c;咱也用国产AI技术&#xff0c;文心一言3.5的文字生成与可灵的图像创作&#xff0c;自动生成一篇文章&#xff0c;提示语文章末下载。 【玄武剑颂星际墨侠】 苍穹为布&#xff0c;星辰织锦&#xff0c;世间万象&#xff0c;皆入我玄武剑公众号之浩瀚画卷。此号…

Python入门 函数传递

目录 函数的多返回值 函数的多种传参形式 位置参数 关键字参数 缺省参数 不定长参数 位置传递 关键字传递 函数作为参数传递 lambda匿名函数 函数定义中 匿名函数的语法 函数的多返回值 按照返回值的顺序&#xff0c;与对应顺序的多个变量接受即可 变量之间用逗号…

SPI协议——对外部SPI操作(跨页读写)

关于W25Q32JVSSIQ的详细内容在之前的两篇文章中已经详细介绍&#xff0c;本文不做太多赘述&#xff0c;如果对芯片的了解有缺失的话&#xff0c;可以参考&#xff1a; SPI协议——对外部SPI Flash操作-CSDN博客 SPI协议——读取外部SPI Flash ID_spi flash 读取id-CSDN博客 目录…

【SpringCloud应用框架】Nacos集群配置

第八章 Spring Cloud Alibaba Nacos之集群配置 文章目录 一、Linux版NacosMySql生产环境配置具体配置&#xff1a; 二、Nacos集群配置更改Nacos启动命令配置原理具体配置测试启动总结 一、Linux版NacosMySql生产环境配置 上一篇博客中已经了解了Nacos生产环境下需要搭建集群配…

ubuntu20.04:ROS驱动usb相机和livox雷达——Noetic版本

简单记录驱动相机和雷达并录包。 目录 前言 一、ROS的简单安装 二、安装USB相机驱动 1.准备工作 2.安装usb_cam驱动 3.修改配置文件和启动相机节点 另一种安装方式 三、配置Livox雷达 1.安装Livox SDK2 2.安装livox_ros_driver2 3.配置和启动雷达节点 四、录制bag包…