重开之数据结构(二刷)

引言:
由于前段时间学习效率不高,导致后面复习前面数据结构没有一个大纲,因此打算重新来学习以下数据结构,期望再次把数据结构学透,并有深刻的印象.并且记录每一次的学习记录 以便于后续复习

二分查找

需求:在有序数组arr内,查找target值

  • 如果找到返回索引位置
  • 如果找不到返回 -1

基础版

步骤:

  1. 设定两个指针(左闭右闭) 分别为 i= 0,j = arr.length-1
  2. 循环条件 i<j ,如果i>j 结束查找 没找到
  3. 定义变量 m = (i+j)/2
  4. 比较target与m索引的值
    (1)target < arr[m] —> j = m-1
    (2)target > arr[m] —> i = m+1
    (3)target = arr[m] —> return m
  5. 循环结束没找到 返回-1;
public static int binarySearch(int[] arr,int target){int i = 0,j = arr.length-1;//设置指针和初始值while(i<=j){int m = (i+j)/2;if(target<arr[m]){j = m-1;}else if(arr[m]<target){i = m+1;}else{return m;}}return -1;}

查找14动态演示
在这里插入图片描述

问题一: 循环条件为i<=j 为什么不是i<j?

相当于多了i=j 这个条件 ,意味着但i=j 时这个元素也要参与比较
比如 查找 5 时 最后 i j m 都会指向5 若没有= 就跳出了循环i,j
就没有参与到比较

请添加图片描述
问题二: (i+j) /2 是否有问题?

从客观来讲,没有问题 但是在极端情况下,数据量达到整型的最大值的(i+j)就会出现问题 由于计算机存储的数据是有一定的范围的,就有可能会导致算出来的结果为负值 所以要用到位运输 (i+j)>>>1 无符号右移可以避免此情况发生

在这里插入图片描述
问题三:若在有序数组中存在相同的元素该如何找到目标元素的首位置或者最后一个位置?
在这里插入图片描述
只需在基础版的else上优化一下即可

改动版

思维逻辑大概与基础版相似 考虑在算法的优劣 这种方法相当于基础版更优化了一些

   public static int binarySearchAlternative(int[] arr,int target){int i = 0,j = arr.length;//变化一:i 作为查找数据的左闭  而j 只是一个边界不参与运输while (i<j){//i<j 表示 j下标的运算不用参与计算了int m = (i+j)>>>1;if (target<arr[m]){j = m;//j始终保持为边界} else if (arr[m]<target) {i = m+1}else{return m;}}return -1;}

平衡版

在基础版中假设在while 循环中执行了L次 ,那么假设目标元素在最左边 if 就执行L次,而如果元素在最右边,if-else 就执行了2*L次 因此用该方法查找时并不平衡.

public static int binarySearchBalance(int[] arr,int target){int i = 0,j = arr.length;while(1<j-i){int m = (j+i)>>>1;if(target<arr[m]){j = m;}else {i = m;}}if(arr[i] == target){return i;}else {return -1;}}

提示

  1. 左闭右开的区间, i 指向可能是目标,而 j 指向的不是目标 是边界
  2. 不在循环内找出,等范围内只剩下 i 时,退出循环,在循环外比较arr[i]与targert\
  3. 循环内的平均比较次数减少了
  4. 时间复杂度为O(log(n)) —> 最坏和最好情况下均是

复杂度

时间复杂度:一个算法的执行,随数据规模增大,而增加的时间成本
空间复杂度:一个算法的执行,随数据规模增大,而额外增加的空间成本

两者均用大O表示法,考虑的是最复杂的情况

例如,二分查找的时间复杂度为O(log(n)) 空间复杂度为O(1);

总结

基础版和改动版的区别在于 给定的指针的位置不同
基础版在于 包括 i 索引和j索引的以内包括自身数据查找 为左闭右闭
改动版在于 包括 i 索引到j索引前的数据查找 为左闭右开

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

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

相关文章

c++(一)

c&#xff08;一&#xff09; C与C有什么区别命名空间使用 输入输出流引用指针和引用的区别定义拓展 函数重载例子测试函数重载原理 参数默认值什么是参数默认值注意 在c中如何引入c的库动态内存分配new、delete与malloc、free的区别&#xff1f; C与C有什么区别 <1>都是…

Introduction of Internet 计算机网络概述

计算机网络的概念 计算机网络的定义&#xff1a; 多台独立的计算机通过通信线路实现资源共享的计算机系统 计算机网络的组成 资源子网&#xff1a;提供共享的软件资源和硬件资源 通信子网&#xff1a;提供信息交换的网络结点和通信线路 计算机网络类型 按照拓扑排序 星型…

【STM32】计算定时器的溢出

TIM2、3、4、5、12、13、14在APB1上&#xff0c;最大计数频率84M。 TIM1、8、9、10、11在APB2上&#xff0c;最大计数频率168M。 time(arr1)/(prescale1)/Tclk 算出来的是秒 下图使用TIM14 84MHz 那么time33600*25000/8400000010S&#xff0c;10S进入一次中断 中断方式开…

基于STM32+NBIOT(BC26)设计的物联网观赏鱼缸

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目模块组成 1.2 设计思路 二、(硬件控制端)硬件选型2.1 STM32开发板2.2 PCB板2.3 USB下载线2.4 NBIOT模块2.5 杜邦线&#xff08;2排&#xff09;2.6 稳压模块2.7 电源插头2.8 水温检测传感器2.9 水质检测…

三星HBM3/3E未通过英伟达测试标准

据报道&#xff0c;三星的最新HBM3与HBM3E内存堆栈在满足英伟达的热能和功耗要求方面遇到了困难。这些内存产品因过热及高功耗问题未能通过英伟达的测试&#xff0c;这对三星来说是一个重大挫折&#xff0c;尤其是考虑到英伟达在全球AI应用处理器市场占据主导地位。同时&#x…

001 CentOS 7.9 安装及配置jdk-8u411-linux-x64.tar.gz

文章目录 1. 下载JDK安装包2. 创建安装目录3. 上传并解压JDK安装包4. 配置环境变量5. 验证安装 1. 下载JDK安装包 首先&#xff0c;需要从Oracle官方网站或其他可信赖的来源下载jdk-8u411-linux-x64.tar.gz安装包。 2. 创建安装目录 在终端中执行以下命令&#xff0c;创建一…

TiDB学习4:Placement Driver

目录 1. PD架构 2. 路由功能 2. TSO 2.1 TSO 概念 2.2 TSO分配过程 2.3 TSO时间窗口 3. 调度 3.1 信息收集 3.2 生成调度(operator) 3.3 执行调度 4. Label 与高可用 4.1 Label 的配置 5. 小结 1. PD架构 PD是整个TiDB的总控&#xff0c;相当于集群的大脑 PD集成了…

Android 版本与 API level 以及 NDK 版本对应

采用 Android studio 开发 Android app 的时候&#xff0c;需要选择支持的最低 API Level 和使用的 NDK 版本&#xff0c;对应开发 app 的最低 SDK 版本&#xff1a; 在 app 的 build.gradle 文件里&#xff0c;对应于代码如下&#xff1a; 目前各版本的占有率情况如下&#xf…

PaddleSeg训练推理及模型转换全流程

文章目录 1、数据准备1.1 数据标注1.2 数据导出1.3 标签较验1.4 数据集整理1.5 标签可视化 2、 模型训练3、模型验证4、模型推理5、模型导出6、导出文件的推理7、将模型转换成onnx8、使用onnx进行推理 本文记录一下使用paddleseg进行语议分割模型对人体进行分割的使用流程。事实…

jmeter服务器性能监控分析工具ServerAgent教程

ServerAgent介绍&#xff1a;支持监控CPU&#xff0c;memory&#xff0c;磁盘&#xff0c;网络等&#xff0c;和JMeter集成&#xff0c;在JMeter的图形界面中&#xff0c;可以实时看到监控的数据&#xff0c;但是&#xff0c;它只能监控硬件资源使用情况。 不能监控应用服务 S…

MySQL:表的约束

文章目录 0.小知识&#xff0c;数据转化1.空属性(非空约束)2.默认值&#xff08;default&#xff09;3.comment&#xff08;列描述&#xff09;4.zerofill(显示约束)5.primary key(主键约束)6.auto_increment(自增长)7.unique(唯一键)8.foreign key (外键)9.综合表结构的设计 表…

头歌OpenGauss数据库-H.存储过程第2关:修改存储过程

编程要求 1、删除存储过程proc01&#xff1b; 2、然后再创建同名的存储过程 在存储过程中先将sel_course表中成绩<60的记录删除&#xff0c;然后创建表tmp(如果已经存在应将其删除)&#xff0c;再将计算机学院&#xff08;cs&#xff09;所有学生的选课成绩插入到tmp表中&am…

机器人与AI:结合应用与未来展望

机器人与AI&#xff1a;结合应用与未来展望 引言 机器人与人工智能&#xff08;AI&#xff09;的结合已经成为现代科技发展的重要方向。随着AI技术的不断进步&#xff0c;机器人不仅在工业领域中得到广泛应用&#xff0c;还逐渐渗透到家庭、医疗、服务等各个领域。本文将探讨…

安装qianfan大模型库,报错:ERROR: Command errored out with exit status 1

安装qianfan大模型库&#xff08;pip install qianfan&#xff09;&#xff0c;报错&#xff1a;ERROR: Command errored out with exit status 1 分析错误&#xff0c;是加载 pycryptodome库时导致的 解决&#xff1a; 1、命令行中重新安装&#xff1a;>pip install pycry…

lspci 显示当前设备的PCI总线信息

lspci 显示当前设备的PCI总线信息 lspci 显示当前设备的PCI总线信息显示当前主机的所有PCI总线信息&#xff1a;以数字方式显示PCI厂商和设备代码同时显示数字方式还有设备代码信息以树状结构显示PCI设备的层次关系&#xff1a;更多信息 lspci 显示当前设备的PCI总线信息 lspc…

XXE(XML外部实体注入)

1、XXE原理 XXE&#xff08;XML外部实体注入&#xff0c;XML External Entity) &#xff0c;在应用程序解析XML输入时&#xff0c;当允许引用外部实体时&#xff0c;可构造恶意内容&#xff0c;导致读取任意文件、探测内网端口、攻击内网网站、发起DoS拒绝服务攻击、执行系统命…

01-Linux【准备篇】

一、学Linux的作用&#xff1f; 1.Linux下开发(部署)软件项目 2.Linux运维 二、Linux的强与弱 1.薄弱 个人桌面领域的应用 此领域是传统Linux应用薄弱的环节&#xff0c;近些年随着Ubuntu、fedora等优秀桌面环境的兴起&#xff0c;Linux在个人桌面领域的占有率在慢慢提高…

潮玩宇宙Dapp游戏:密室大逃杀的魅力探索

在潮玩宇宙这片充满创意与激情的虚拟世界中&#xff0c;一款名为“密室大逃杀”的Dapp游戏凭借其独特的玩法和紧张刺激的氛围&#xff0c;迅速成为了玩家们热衷的焦点。这款游戏不仅融合了传统的密室逃脱元素&#xff0c;还巧妙地结合了区块链技术&#xff0c;为玩家带来了全新…

docker不删除容器更改其挂载目录

场景&#xff1a;docker搭建的jenkins通常需要配置很多开发环境&#xff0c;当要更换挂载目录&#xff0c;每次都需要删除容器重新运行&#xff0c;不在挂载目录的环境通常不会保留。 先给一个参考博客docker不删除容器&#xff0c;修改容器挂载或其他_jenkins 修改容器挂载do…

4句口诀记住《和差化积、积化和差》的8个公式【自创】

口诀1&#xff08;基础&#xff09;&#xff1a;先α后β&#xff0c;先加后减。 口诀2&#xff1a;异s同c【补充记忆&#xff1a;前加后减&#xff0c;双s双减】 s c 1 2 [ s s ] c c 1 2 [ c c ] sc\frac{1}{2}[ss]\ \ \ \ \ \ \ \ \ \ cc\frac{1}{2}[cc] sc21​[ss] …