当前位置: 首页 > news >正文

重开之数据结构(二刷)

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

二分查找

需求:在有序数组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 无符号右移可以避免此情况发生

在这里插入图片描述

改动版

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

   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索引前的数据查找 为左闭右开

相关文章:

重开之数据结构(二刷)

引言: 由于前段时间学习效率不高,导致后面复习前面数据结构没有一个大纲,因此打算重新来学习以下数据结构,期望再次把数据结构学透,并有深刻的印象.并且记录每一次的学习记录 以便于后续复习 二分查找 需求:在有序数组arr内,查找target值 如果找到返回索引位置如果找不到返回…...

JVM(三)

在上一篇中&#xff0c;介绍了JVM组件中的类加载器&#xff0c;以及相关的双亲委派机制。这一篇主要介绍运行时的数据区域 JVM架构图&#xff1a; JDK1.8后的内存结构&#xff1a; (图片来源&#xff1a;https://github.com/Seazean/JavaNote) 而在运行时数据区域中&#…...

【二叉树】:LeetCode:100.相同的数(分治)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;初阶初阶结构刷题 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 1.问题描述&#xff1a; 2.问题分析&#xff1a; 二叉树是区分结构的&#xff0c;即左右子树是不一…...

[AI Google] 介绍 VideoFX,以及 ImageFX 和 MusicFX 的新功能

VideoFX 是来自 labs.google 的最新实验&#xff0c;您可以查看音乐效果和图像效果的新更新&#xff0c;现在在 110 多个国家可用。 生成式媒体正在改变人们构思创意并增强我们的创造力能力的方式。我们致力于与创作者和艺术家合作构建人工智能&#xff0c;以更好地理解这些生成…...

[7] CUDA之常量内存与纹理内存

CUDA之常量内存与纹理内存 1. 常量内存 NVIDIA GPU卡从逻辑上对用户提供了 64KB 的常量内存空间&#xff0c;可以用来存储内核执行期间所需要的恒定数据常量内存对一些特定情况下的小数据量的访问具有相比全局内存的额外优势&#xff0c;使用常量内存也一定程序上减少了对全局…...

python使用base加密解密

原理 base编码是一种加密解密措施&#xff0c;目前常用的有base16、base32和base64。其大致原理比较简单。 以base64为例&#xff0c;base64加密后共有64中字符。其加密过程是编码后将每3个字节作为一组&#xff0c;这样每组就有3*824位。将每6位作为一个单位进行编码&#xf…...

简述vue.mixin的使用场景和原理

Vue.mixin的使用场景 Vue.mixin是Vue的全局混入功能&#xff0c;它提供了一种非常灵活的方式来分发Vue组件中的可复用功能。使用Vue.mixin可以为Vue实例和组件添加全局的方法、属性、钩子函数等。具体的使用场景包括&#xff1a; 全局设置默认属性或方法&#xff1a;例如&…...

C# WPF入门学习(四)—— 按钮控件

上期介绍了WPF的实现架构和原理&#xff0c;之后我们开始来使用WPF来学习各种控件。 一、尝试插入一个按钮&#xff08;方法一&#xff09; 1. VS2019 在界面中&#xff0c;点击工具栏中的视图&#xff0c;在下拉菜单中选择工具箱。 至于编译器中的视图怎么舒服怎么来布置&am…...

大模型效能工具之智能CommitMessage

01 背景 随着大型语言模型的迅猛增长&#xff0c;各种模型在各个领域的应用如雨后春笋般迅速涌现。在研发全流程的效能方面&#xff0c;也出现了一系列贯穿全流程的提效和质量工具&#xff0c;比如针对成本较高的Oncall&#xff0c;首先出现了高质量的RAG助手&#xff1b;在开…...

PyQt6--Python桌面开发(33.QToolBar工具栏控件)

QToolBar工具栏控件...

node环境问题(无法加载文件D:\Software\Node.js\node_global\vue.ps1,因为在此系统上禁止运行脚本。)

问题&#xff1a;npm安装lerna显示安装成功&#xff0c;但是lerna -v的时候报错 解决步骤&#xff1a; 1、输入&#xff1a;Get-ExecutionPolicy 2、输入&#xff1a;Set-ExecutionPolicy -Scope CurrentUser&#xff08;有选项的选Y&#xff09; 3、输入&#xff1a;RemoteSi…...

位运算算法

位运算是计算机中常用的一种运算方法&#xff0c;它直接对二进制数的位进行操作。位运算主要包括按位与&#xff08;&&#xff09;、按位或&#xff08;|&#xff09;、按位异或&#xff08;^&#xff09;、按位取反&#xff08;~&#xff09;、左移&#xff08;<<&a…...

重学java 45.多线程 下 总结 定时器_Timer

人开始反向思考 —— 24.5.26 定时器_Timer 1.概述:定时器 2.构造: Timer() 3.方法: void schedule(TimerTask task, Date firstTime, long period) task:抽象类,是Runnable的实现类 firstTime:从什么时间开始执行 period:每隔多长时间执行一次…...

MongoDB(介绍,安装,操作,Springboot整合MonggoDB)

目录 MongoDB 1 MongoDB介绍 MongoDB简介 MongoDB的特点 MongoDB使用场景 小结 2 MongoDB安装 安装MongoDB 连接MongoDB MongoDB逻辑结构 MongoDB数据类型 小结 3 MongoDB操作 操作库和集合 操作文档-增删改 操作文档-查询 MongoDB索引 小结 4 SpringBoot整合…...

【数字移动通信】期末突击

文章目录 复习题一.简答题1、常用的移动通信系统有哪些?2、分别列出1G,2G,3G,4G的典型系统或标准&#xff1f;3、移动通信信道的基本特征&#xff1f;4、电波传播预测模型是用来计算什么量的&#xff0c;在选择传播预测模型时&#xff0c;主要考虑哪些因素&#xff1f;5、什么…...

数据库(5)——DDL 表操作

表查询 先要进入到某一个数据库中才可使用这些指令。 SHOW TABLES; 可查询当前数据库中所有的表。 表创建 CREATE TABLE 表名( 字段1 类型 [COMMENT 字段1注释] ...... 字段n 类型 [COMMENT 字段n注释] )[COMMENT 表注释]; 例如&#xff0c;在student数据库里创建一张studen…...

【Java EE】网络协议——HTTP协议

目录 1.HTTP 1.1HTTP是什么 1.2理解“应用层协议” 1.3理解HTTP协议的工作过程 2.HTTP协议格式 2.1抓包工具的使用 2.2抓包工具的原理 2.3抓包结果 3.协议格式总结 1.HTTP 1.1HTTP是什么 HTTP&#xff08;全称为“超文本传输协议”&#xff09;是一种应用非常广泛的应…...

Docker提示某网络不存在如何解决,添加完网络之后如何删除?

Docker提示某网络不存在如何解决&#xff1f; 创建 Docker 网络 假设现在需要创建一个名为my-mysql-network的网络 docker network create my-mysql-network运行容器 创建网络之后&#xff0c;再运行 mysqld_exporter 容器。完整命令如下&#xff1a; docker run -d -p 9104…...

C++ 红黑树

目录 1.红黑树的概念 2.红黑树的性质 3.红黑树节点的定义 4.红黑树的插入操作 5.数据测试 1.红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个…...

PTA 6-4 配对问题

许多大学生报名参与大运会志愿者工作。其中运动场引导员需要男女生组队&#xff0c;每组一名男生加一名女生&#xff0c;男生和女生各自排成一队&#xff0c;依次从男队和女队队头各出一人配成小组&#xff0c;若两队初始人数不同&#xff0c;则较长那一队未配对者调到其他志愿…...

OBS多平台直播插件:为什么选择obs-multi-rtmp进行同步推流?

OBS多平台直播插件&#xff1a;为什么选择obs-multi-rtmp进行同步推流&#xff1f; 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否曾经想过&#xff0c;如何将你的直播内容同时推…...

nli-distilroberta-base保姆级教学:NLI结果集成至Elasticsearch脚本评分器

nli-distilroberta-base保姆级教学&#xff1a;NLI结果集成至Elasticsearch脚本评分器 1. 项目介绍 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务。它能帮你判断两个句子之间的关系&#xff0c;就像一个有逻辑思维能力的AI助手。想象一下&a…...

Linux 线程调度策略详解:SCHED_OTHER、SCHED_FIFO、SCHED_RR

在 Linux POSIX 线程编程中&#xff0c;调度策略直接决定了线程如何竞争 CPU 资源&#xff0c;也是面试与嵌入式、实时开发中的高频考点。本文从原理、特点、适用场景到代码示例&#xff0c;彻底讲清楚三种调度策略&#xff1a;SCHED_OTHER、SCHED_FIFO、SCHED_RR。 一、基础概…...

Windows任务栏美化终极指南:TranslucentTB让你的桌面秒变高级感

Windows任务栏美化终极指南&#xff1a;TranslucentTB让你的桌面秒变高级感 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 还在忍受Wind…...

30KHz调频深度0.5%:用示波器实测SSC扩频时钟的完整指南(以PCIe为例)

30KHz调频深度0.5%&#xff1a;用示波器实测SSC扩频时钟的完整指南&#xff08;以PCIe为例&#xff09; 在高速数字系统设计中&#xff0c;电磁干扰&#xff08;EMI&#xff09;始终是工程师面临的核心挑战之一。当PCIe 3.0信号以8GT/s速率传输时&#xff0c;时钟信号的谐波辐射…...

语言的边界,与软件的命运萍

1. 引入 在现代 AI 工程中&#xff0c;Hugging Face 的 tokenizers 库已成为分词器的事实标准。不过 Hugging Face 的 tokenizers 是用 Rust 来实现的&#xff0c;官方只提供了 python 和 node 的绑定实现。要实现与 Hugging Face tokenizers 相同的行为&#xff0c;最好的办法…...

从ESXi到vCenter:一个Trunk口的网络配置,如何影响你整个VMware虚拟化的稳定性?

从ESXi到vCenter&#xff1a;Trunk口网络配置如何重塑VMware虚拟化架构稳定性 在虚拟化环境中&#xff0c;网络配置往往是最容易被低估却影响最深远的环节。许多管理员在部署VMware集群时&#xff0c;会本能地选择最简单的Access口配置——毕竟它能快速让系统跑起来&#xff0c…...

GyverWire:嵌入式轻量级通用串行通信框架

1. GyverWire&#xff1a;面向嵌入式系统的轻量级、高鲁棒性通用串行通信框架GyverWire 是一款专为资源受限嵌入式平台&#xff08;尤其是 Arduino 生态&#xff09;设计的底层通信库&#xff0c;其核心目标并非实现某一种特定物理层协议&#xff0c;而是提供一个可复用、可扩展…...

如何高效生成技术文章:方法与工具详解

如何高效生成技术文章&#xff1a;方法与工具详解 在当前科技发展迅速的时代&#xff0c;技术文章已成为工程师、开发者及技术爱好者共享知识、交流经验的重要载体。本文将为您详细介绍高效生成技术文章的具体方法与常用工具&#xff0c;助您提升写作效率与质量。 1. 明确写作主…...

Spring事件机制实战:从入门到精通,手把手教你实现松耦合通信

Spring事件机制实战&#xff1a;从零构建松耦合通信系统 在复杂的业务系统中&#xff0c;组件间的通信往往像一团纠缠的线缆——修改任何一处都可能引发连锁反应。Spring事件机制正是为解决这种耦合困境而生的设计模式实践&#xff0c;它让组件间的对话变得优雅而安全。想象一下…...