数据结构与算法—二分查找

news/2024/5/9 5:15:37/文章来源:https://blog.csdn.net/WANGYONGZIXUE/article/details/129212141

目录

二分查找

时间复杂度

程序设计要点

局限性

二分查找的变形

实例分析

二叉搜索实现(不考虑重复条件)


二分查找

        针对的是一个有序的数据集合,查找思想类似于分治思想。

每次通过跟区间中的元素对比,将待查找的区间缩小为原来的一半,直到找到数据为止,或区间缩小到0

时间复杂度

        查找速度O(logn),非常高效

N, n/2 , n/4 , … n/2^k

经过K次区间缩小操作,时间复杂度O(K)

n/2^k = 1 -> k = log2n 时间复杂度O(logn)

42亿个数据用二分查找,最多32次找到

程序设计要点

1,循环退出条件 low<=high

2、mid取值 mid=(low+high)/2 不佳,如果low,high比较大,之和可能溢出。

        low+(high-low)/2  或者 low+((high-low)>>1)

3、low,high值更新

        low=mid+1,high=mid-1

可以使用递归实现

局限性

1、依赖的顺序结构,数组。

        链表是不可以的

2、有序的数据

        动态的插入,删除,使用二叉树

3、数据量太小,不适合二分查找

4、数据量太大,不适合。数据连续存储困难。1GB数据太大

实例:如何在1000万个整数快速查找某个整数,内存限制100MB

        每个数据大小是8字节,将1000万数据存在数组中,内存占用80MB。

        8*10000000/1024/1024 = 76.2939MB

先排序,再用二分查找。

散列表和二叉树好像能解?实际上不行的,内存空间不够,节点指针占用空间。

二分查找的变形

1、查找第一个等于给定元素的值

2、查找最后一个等于给定元素的值

3、查找第一个大于等于给定元素的值

4、查找最后一个小于等于给定元素的值 

实例分析

查找IP地址归属地,IP区间

假设有12万条这样的IP区间与归属地对应关系,如何快速定位出一个IP地址的归属地?

因为IP地址区间不经常更新,先将12万条数据,按照起始地址IP 从小到大排列(IP地址转化为32位的整型数)

在有序数组中,查找最后一个小于等于某个给定值的元素。

通过二分查找,找到最后一个起始IP小于等于这个IP地址区间,然后,检查这个IP是否在这个IP区间内,如果在,就取出对应的归属地显示,如果不在则返回没找到。

二分查找能解决的问题,大部分倾向于用散列表或者二叉查找树。即使二分查找在内存使用上更节省,但毕竟内存如此紧缺的情况并不多。

二分查找更适合在“近似”查找问题,如二分查找的变体边界查找的处理。如果用散列表、二叉树、比较难实现。

二叉搜索实现(不考虑重复条件)

#include<stdio.h>
#include<stdlib.h>typedef int(*binarch_search)(int *arr,int size,int val);//使用递归实现
int binary_search_rec(int *arr,int size,int val)
{int mid = size / 2;int idx;if(arr[mid] == val)return mid;if(!mid)return -1;if(arr[mid]<val){idx = binary_search_rec(arr+mid+1,size - mid -1,val);if(idx !=-1)idx +=mid+1;}else{idx = binary_search_rec(arr,mid,val);}return idx;
}
//使用迭代
int binary_search_iter(int *arr,int size,int val)
{int low,mid;int high = size - 1;while(low < high){mid = (low + high)/2;if(arr[mid] == val)return mid;if(arr[mid] < val)low = mid + 1;elsehigh = mid -1;}}void iter_test(binarch_search binary_search_fun)
{int arr[10] = {1, 4, 5, 9, 12, 19, 21, 28, 31, 36};int idx ; idx = binary_search_fun(arr,10,12);if(idx != -1){printf("find 12 at %d\n",idx);}else{printf("12 not find in arr\n");}}//实现方法不同,参数相同
//回调函数使用void main()
{iter_test(binary_search_iter);iter_test(binary_search_rec);}

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

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

相关文章

随想录二刷Day06——链表

文章目录链表6. 删除链表的倒数第 N 个结点7. 链表相交8. 环形链表 II链表 6. 删除链表的倒数第 N 个结点 19. 删除链表的倒数第 N 个结点 思路&#xff1a; 用双指针的方法&#xff0c;fast 和 slow 之间保持距离为 n&#xff0c;只需要遍历一次即可完成删除任务。 为了方便…

使用jenkins实现自动化部署springboot应用

1. 前置准备 这里代码仓库使用gitlab。在介绍如何通过gitlab和jenkins进行自动化部署之前&#xff0c;需要先安装完成gitlab以及jenkins。两种程序的安装方式以及相关配置可以参看以下内容&#xff1a; linux中安装gitlab&#xff1a;linux安装极狐gitlab linux中安装jenki…

EasyRecovery16最新免费版电脑数据恢复软件功能介绍

EasyRecovery是一款支持Windows/Mac平台进行恢复图片的专业工具&#xff0c;尤其是各种流行单反相机RAW格式文件&#xff0c;以及超大型视频文件等&#xff0c;推荐摄影爱好者使用。适用于主流相机、无人机、PC、存储卡、USB 闪存驱动器等&#xff0c;由于删除、损坏或意外格式…

[数据结构]:05-循环队列(链表)(C语言实现)

目录 前言 已完成内容 循环队列实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-QueueCommon.cpp 04-QueueFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代码。使用C引用主要是为了…

CountDownLatch与CyclicBarrier原理剖析

1.CountDownLatch 1.1 什么是CountDownLatch CountDownLatch是一个同步工具类&#xff0c;用来协调多个线程之间的同步&#xff0c;或者说起到线程之间的通信&#xff08;而不是用作互斥的作用&#xff09;。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之…

学习网安需要了解的一些基础知识

P1.基本概念 1.POC/EXP POC(proof of concept)常指一段漏洞验证代码&#xff1b;EXP(exploit)指利用系统漏洞进行攻击的动作 PoC是证明漏洞存在的,而 Exp 是利用这个漏洞进一步进行攻击&#xff0c;先有POC&#xff0c;才有EXP 2.Payload/shellcode payload&#xff0…

学习周报2.26

文章目录前言文献阅读摘要方法结果深度学习Encoder-Decoder&#xff08;编码-解码&#xff09;信息丢失的问题Attention机制总结前言 This week,I read an article about daily streamflow prediction.This study shows the results of an in-depth comparison between two di…

Lambda表达式的本质

一直想写一篇文章&#xff0c;来总结lambda表达式&#xff0c;但是之前感觉总结的不是特别到位&#xff0c;现在看了几篇文章和视频后&#xff0c;感觉对lambda表达式有了比较深刻的认识&#xff0c;现在进行记录总结如下&#xff1a; lambda表达式又叫做匿名函数&#xff0c;…

网络应用之HTTP响应报文

HTTP响应报文学习目标能够知道HTTP响应报文的结构1. HTTP响应报文分析HTTP 响应报文效果图:响应报文说明:--- 响应行/状态行 --- HTTP/1.1 200 OK # HTTP协议版本 状态码 状态描述 --- 响应头 --- Server: Tengine # 服务器名称 Content-Type: text/html; charsetUTF-8 # 内容类…

【教程】Notion笔记多平台设置中文显示

这个笔记软件界面挺好看&#xff0c;惊艳到了。 目录 网页版 桌面端 Windows版 Mac端 安卓端 网页版 直接安装这个插件即可&#xff0c;Chrome/Edge适用&#xff1a;Notion中文版 桌面端 都要去这个github下载语言包&#xff0c;用于替换文件&#xff1a;https://github.c…

xxjob分布式任务调度

前言 在工作中使用到了定时任务,通过查找资料选择了xxjob,以下是xxjob的介绍以及基本的使用. xxjob介绍 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 将调度行为抽象形成“调度中心”公共平台&#xff0c;而平台自身…

OpenCV-Python系列(二)—— 图像处理(灰度图、二值化、边缘检测、高斯模糊、轮廓检测)

一、【灰度图、二值化】 import cv2 img cv2.imread("lz2.png") gray_img cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图 # 二值化&#xff0c;(127,255)为阈值 retval,bit_img cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY) cv2.imshow(photo1,im…

Laravel框架03:DB类操作数据库

Laravel框架03&#xff1a;DB类操作数据库一、概述二、数据表的创建与配置三、增删改操作1. 增加信息2. 修改数据3. 删除数据四、查询操作1. 取出基本数据2. 取出单行数据3. 获取一个字段的值4. 获取多个字段的值5. 排序6. 分页五、执行任意的SQL语句一、概述 按照MVC的架构&a…

【R统计】R语言相关性分析及其可视化

&#x1f482; 个人信息&#xff1a;酷在前行&#x1f44d; 版权: 博文由【酷在前行】原创、需要转载请联系博主&#x1f440; 如果博文对您有帮助&#xff0c;欢迎点赞、关注、收藏 订阅专栏&#x1f516; 本文收录于【R统计】&#xff0c;该专栏主要介绍R语言实现统计分析的…

浅谈QWebChannel、QWebChannelAbstractTransport、QWebSocketServer、QWebSocket用法及之间关系

1.前言在现实业务中&#xff0c;经常遇到这样的需求&#xff1a;一端采用web形式开发的&#xff0c;如&#xff1a;客户端采用html、javascript、nodejs开发&#xff1b;而另一端采用C开发&#xff0c;如&#xff1a;Qt开发的服务端。web页面端需和Qt开发的服务端进行通信、数据…

房屋出租管理系统

1. 铺垫 1.1 项目真实开发的过程 上来要做什么&#xff1f;&#xff1f;&#xff1f;&#xff1f; 有电脑—》配环境&#xff08;JDK、IDEA、MAVEN……&#xff09; 这个项目&#xff1a;房屋管理系统 从什么角度出发&#xff0c;第一步做什么&#xff1f;&#xff1f; 架构 …

IoT项目系统架构案例2

项目背景 1.这个项目是对之前的案例的升级改造参考&#xff1a;IoT项目系统架构案例_iot案例_wxgnolux的博客-CSDN博客2.基于方案1的项目实施过程中碰到的问题,对硬件设备标准化的理念及新的功能需求(如根据天气预报温度调水温,APP界面可操作性优化等)•采用目前IoT主流厂商的架…

vue中render函数的作用和参数(vue2中render函数用法)

render 函数是 Vue2.x 新增的一个函数、主要用来提升节点的性能&#xff0c;它是基于 JavaScript 计算。使用 Render 函数将 Template 里面的节点解析成虚拟的 Dom 。Vue 推荐在绝大多数情况下使用模板来创建 HTML。然而在一些场景中&#xff0c;需要 JavaScript 的完全编程能力…

gitlab部署使用,jenkins部署使用

gitlab部署使用&#xff0c;jenkins部署使用gitlab下载gitlab安装gitlab使用gitlab设置中文修改管理员密码创建组,创建项目,创建用户jenkins下载jenkins安装jenkin使用jenkins更改管理员密码配置拉取代码配置登录gitlab拉取代码的账号密码配置项目配置gitlab仓库配置构建构建构…

CTFer成长之路之Python中的安全问题

Python中的安全问题CTF 1.Python里的SSRF 题目提示 尝试访问到容器内部的 8000 端口和 url path /api/internal/secret 即可获取 flag 访问url&#xff1a; http://f5704bb3-5869-4ecb-9bdc-58b022589224.node3.buuoj.cn/ 回显如下&#xff1a; 通过提示构造payload&…