【算法】-- 二分查找详注

news2024/11/18 9:27:01

引入

二分查找,也称为折半查找;首先,二分查找是一种基于有序数组中查找特定元素的算法,所以它会因为数组的一些特性而受限。它的工作原理是不断将要查找的区间分成两部分,然后确定目标值可能存在的区间,直到找到目标值或者确定目标值不存在为止。这个算法的时间复杂度为O(log n),其中n是数组的大小。二分查找通常比线性查找(暴力查找)快,尤其是在大型数组中查找元素时。

时间复杂度

相比于暴力求解,二分查找大幅提高了查找的效率。在中国14亿人中,用二分查找算法找一个人最多只需要31次。二分查找大大地提升了程序运行的效率。

计算时间复杂度:

数组的元素个数为N,每查找一次,数组元素减半,数组元素个数依次递减为N / 2,N / 4,N / 8  ...... 。

那么反过来,2 * 2 * 2 * 2 .......2 = N 。假设一共有x个2 , 那么x就等于 log以2为底N的对数,所以二分查找的时间复杂度为O(logN)

图解示例

接下来我用一个具体的例子来阐释二分查找的逻辑,取一个定长的数组,查找数据10。

区间讨论

二分查找本质上是在区间上进行查找,区间可以取左闭右开,也可以取左闭右闭;循环的条件可以是while(left < right),也可以是 while(left <= right)

循环的条件是while(left <= right)

那么当左右相等时,因为左右都取的闭区间,还要进行依次查找。

循环的条件是while(left < right)

这个时候,当左右相等时,因为是左闭右开区间,区间内已经没有数了,循环结束。

左闭右开:

#include <stdio.h>

int binary_search(int arr[], int size, int target) {
    int left = 0;
    int right = size;  // 注意右边界是数组大小而不是数组大小减一

    while (left < right) {
        int mid = left + (right - left) / 2;  // 计算中间索引

        if (arr[mid] == target) {
            return mid;  // 找到目标值,返回索引
        } else if (arr[mid] < target) {
            left = mid + 1;  // 目标值在右侧
        } else {
            right = mid;  // 目标值在左侧,注意右边界不减一
        }
    }

    return -1;  // 未找到目标值
}

int main() {
    // 测试数据
    int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17};
    int size = sizeof(arr) / sizeof(arr[0]);  // 计算数组大小

    int target = 9;  // 目标值

    int result = binary_search(arr, size, target);

    if (result != -1) {
        printf("目标值 %d 在数组中的索引为 %d\n", target, result);
    } else {
        printf("目标值 %d 不存在于数组中\n", target);
    }

    return 0;
}

左闭右闭:

#include <stdio.h>

int binary_search(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) {
            left = mid + 1;  // 目标值在右侧
        } else {
            right = mid - 1;  // 目标值在左侧
        }
    }

    return -1;  // 未找到目标值
}

int main() {
    // 测试数据
    int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17};
    int size = sizeof(arr) / sizeof(arr[0]);  // 计算数组大小

    int target = 9;  // 目标值

    int result = binary_search(arr, size, target);

    if (result != -1) {
        printf("目标值 %d 在数组中的索引为 %d\n", target, result);
    } else {
        printf("目标值 %d 不存在于数组中\n", target);
    }

    return 0;
}

局限性

虽然二分查找可大幅简便运算,但是它外强中干,在实际中不实用,它有一下缺点:

  1. 要求有序数组: 二分查找只能在有序数组中进行,如果数组未排序,则需要先对数组进行排序,这会增加额外的时间复杂度。

  2. 不适用于动态数据集: 如果数据集经常发生变化,需要频繁地插入、删除或更新元素,那么二分查找的效率会大大降低,因为它无法动态地调整查找区间。

  3. 空间复杂度高: 二分查找通常需要占用较多的内存空间,因为它需要维护额外的索引或指针来跟踪查找区间。

  4. 不适用于链表等非随机访问结构: 二分查找依赖于随机访问,因此不适用于链表等非随机访问结构,因为无法直接通过索引来访问元素。

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

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

相关文章

VUE 或 Js封装通用闭包循环滚动函数

1、vue3 闭包滚动函数的使用 js 调用也基本雷同 // 滚动Tab组件const scoreTabRef ref()// 滚动的选项const scrollOption ref({// 滚动的Dom元素scrollDom: null,// 滚动的时间间隔scrollInterval: 1500,// 滚动的距离scrollSep: 100,// 滚动历时时间scrollDuration: 10…

视频汇聚边缘网关EasyCVR硬件设备无法访问域名,解析失败该如何处理?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备传统安防视…

240多道!Go开发岗位面试题合集(含答案)

随着今年互联网寒潮环境的影响&#xff0c;找工作的人也将达到顶峰&#xff0c;今天给大家分享一份《Go开发工程师超高频面试真题》&#xff0c;一共有240多道面试真题&#xff0c;希望能够帮助大家在面试中&#xff0c;少走一些弯路、更快拿到offer&#xff01; 内容展示 GO 基…

uniapp0基础编写安卓原生插件之编写安卓页面在uniapp上显示(摄像头调用)

前言 如果你对安卓插件开发部分不熟悉你可以先看uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件 效果 开始 dcloud_uniplugins.json {"nativePlugins": [{"hooksClass": "","plugins": [{&…

信奥一本通:1103:陶陶摘苹果

#include <iostream> using namespace std; int a[101]; int main(){int n 10;//题目要求输十个数 for(int i 1;i < 10; i){cin >> a[i];//赋值到数组 }int c;cin >> c;//要求的值 int cnt 0;//计数 for(int i 1; i < n; i){//循环比较是否小于&am…

试用NXP官方的UDS bootloader

文章目录 1.前言2.资料获取2.1 MCU例程 2.2 开发环境2.3 上位机2.4 硬件 3.工程修改3.1 boot工程修改 3.2 app工程修改4.测试情况5.例程分享 1.前言 最近很多客户在开发S32K系列MCU时咨询是否可以提供基于UDS协议的bootloader。本文以S32K144为例&#xff0c;介绍如何使用NXP官…

Parallels Desktop 19 for Mac v19.3.0.54924中文破解版

Parallels Desktop 19 for Mac v19.3.0.54924中文破解版是一款强大的虚拟机软件&#xff0c;支持多操作系统&#xff0c;提供卓越的虚拟化技术&#xff0c;确保流畅稳定的运行。新增特色功能如共享打印、TouchID集成等&#xff0c;提供便捷高效的虚拟机体验。界面美观现代&…

window golang 升级版本

执行go tidy&#xff0c;发现执行不了&#xff0c;得升级一下版本了 进入官网&#xff0c;并选择合适的系统以及版本。https://go.dev/dl/ 这台电脑是windows&#xff0c;我本人比较喜欢下载zip自己解压。 解压&#xff0c;这里我选择直接覆盖原文件&#xff0c;需要保留原版…

即将开幕,邀您共赴创新之旅“2024上海国际消费者科技及创新展览会”

备受期待的2024上海国际消费者科技及创新展览会&#xff08;以下简称“CTIS”&#xff09;即将于6月13日至15日亮相上海新国际博览中心N1-N3馆。 2024上海国际消费者科技及创新展览会总面积达40,000平方米&#xff0c;涵盖600余家展商&#xff0c;预计吸引40,000多位观众莅临现…

autodl 上 使用 LLaMA-Factory 微调 中文版 llama3

autodl 上 使用 LLaMA-Factory 微调 中文版 llama3 环境准备创建虚拟环境下载微调工具 LLaMA-Factory下载 llama3-8B开始微调测试微调结果模型合并后导出vllm 加速推理 环境准备 autodl 服务器&#xff1a; https://www.autodl.com/console/homepage/personal 基本上充 5 块钱…

毕业论文应该怎么写?推荐几款ai写论文工具

时间过的好快&#xff0c;马上又到了一年一度的毕业季了&#xff0c;对于即将毕业的学生来说毕业论文是一道难过的坎&#xff0c;想到自己为了毕业论文熬的夜&#xff0c;掉的头发&#xff0c;真的深有感触。 不过虽然翟博士给大家的毕业论文设了高门槛&#xff0c;但是随着时…

springboot项目中引入Xxl-Job并部署和使用

目录 模块划分 配置调度中心 配置执行器 添加执行器 写一个简单的定时任务 XxlJobHelper xxl-job是分布式任务调度平台&#xff0c;部署为独立的调度服务平台 github地址&#xff1a;xuxueli/xxl-job: A distributed task scheduling framework.&#xff08;分布式任务调度…

ctfshow之_萌新web9至web10

一、访问在线靶场ctfshow 1、web9 如下图所示&#xff0c;进入_萌新赛的web9问题&#xff0c;题目提醒flag在config.php中&#xff1a; 如上图所示&#xff0c;可以get传参&#xff0c;且传入的参数需要正则匹配system、exec、highlight&#xff0c;且不区分大小写&#xff0…

Flink checkpoint 源码分析- Checkpoint snapshot 处理流程

背景 在上一篇博客中我们分析了代码中barrier的是如何流动传递的。Flink checkpoint 源码分析- Checkpoint barrier 传递源码分析-CSDN博客 最后跟踪到了代码org.apache.flink.streaming.runtime.io.checkpointing.CheckpointedInputGate#handleEvent 现在我们接着跟踪相应…

element ui的确认提示框按钮样式修改

修改确认提示框的默认按钮样式&#xff0c;使用css强制修改 例&#xff1a; js代码&#xff1a; deleteUser(params){this.$confirm("您确定要删除吗&#xff1f;此操作无法撤销并且将永久删除所有数据。", "提示", { type: "warning", cancel…

西奥CHT-01软胶囊硬度计:开启硬度测试新纪元,引领制药行业品质升级

西奥CHT-01软胶囊硬度计&#xff1a;开启硬度测试新纪元&#xff0c;引领制药行业品质升级 在追求品质卓越的制药行业中&#xff0c;软胶囊硬度测试是确保药品质量与安全的关键环节。为了满足行业对高精度、高效率硬度测试的需求&#xff0c;西奥科技推出了CHT-01软胶囊硬度计…

【XR806开发板试用】使用FDCM操作Flash记录开机次数

一、寻找系统分配的自定义用户数据地址 &#xff08;1&#xff09;XR806的Flash布局 如图1所示&#xff0c;FLASH的布局有两种&#xff1a; 1、没有开启OTA模式&#xff1b;Image1PaddingSysinfo 2、开启OTA模式&#xff1b;Image1PaddingSysinfoOTA area Image2 Padding 如图…

一维数组 和 关键字 sizeof

数组的概念 “ 数组 ”我们可以理解成一组相同类型元素的集合 &#xff08;1&#xff09;其中可以是单个或是多个元素&#xff0c;可以是0&#xff0c;但元素个数不能为0 &#xff08;2&#xff09;一个数组中存放的元素必须是同类型的&#xff0c;比如一组整型&#xff0c;…

ruoyi-nbcio 基于flowable规则的多重并发网关的任意跳转

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

【密评】 | 商用密码应用安全性评估从业人员考核题库(6/58)

根据Kerckhoffs原则&#xff0c;密码系统的安全性主要依赖于&#xff08;&#xff09;。 A. 密钥 B. 加密算法 C. 解密算法 D. 通信双方 2000年10月&#xff0c;美国NIST宣布&#xff08;&#xff09;算法作为新的高级加密标准AES。 A. Rijndael B. RC6 C. SERPENT D. Twofish…