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

【看海的算法日记✨优选篇✨】第三回:二分之妙,寻径中道

🎬 个人主页:谁在夜里看海.

📖 个人专栏:《C++系列》《Linux系列》《算法系列》

⛰️ 一念既出,万山无阻


目录

📖一、算法思想

细节问题

📚左右临界

📚中点选择 

📚循环条件

📖二、具体运用 

1.⼆分查找

算法思路

算法流程

代码

2.查找元素的第⼀个和最后⼀个位置

算法思路

算法流程

代码

3.x的平⽅根

算法思路

代码

4.⼭峰数组的峰顶

算法思路

算法流程

代码

5.点名

算法思路

代码

📖三、总结


📖一、算法思想

二分算法是一种经典的高效查询方法,它的核心思想是通过不断将查找范围缩小为一半,从而大大减少查找的时间复杂度。

例如,在一个有序数组中,我们要查找指定元素,最简单的方法是遍历数组,时间复杂度为O(n);

然而使用二分算法,cur每次从待遍历数组的中心位置开始,判断元素大小:

① <目标元素,说明目标元素在右区间,更新cur,指向右区间的中心位置;

② >目标元素,说明目标元素在左区间,更新cur,指向左区间的中心位置。

此时最坏情况是遍历log(n)次,因此时间复杂度为log(n),这意味着,在100万个数中查找目标元素最多只需要遍历20次,极大提高了效率。

二分算法的本质思想理解起来并不难,但是在具体运用之前,我们还需要对二分算法有一个更深入的了解:二分算法的细节问题

细节问题

📚左右临界

在二分算法的具体运用中,我们不仅需要一个cur指针,指向区间的中点,还需要left和right指针,标记区间的左右临界位置,每次遍历之后都需要对临界位置进行更新,更新需要分为三种情况:

①:目标元素(不重复)

这种情况是最好处理的,每次更新时直接将左指针(或右指针)指向cur后一个位置(或前一个位置)即可:

②:连续序列的左端点

如果我们要查询的不是一个元素,而是一个连续序列的左端点,例如在 “1, 3, 5, 6, 6, 7, 9, 10” 中查找元素6的开始位置:

这个时候cur等于目标值,但是并不是需要的结果,此时cur应该继续向左区间移动,但是right指针该怎么调整呢?

我们可以把数组看成a、b两个区间,而我们最终要找的是b区间的左端点:

① cur < 目标值,cur需要指向右区间的中点,而左区间(1,2,3)被排除了,所以left指向cur的后一个位置;

② cur >= 目标值,由于我们要找的数连续序列的左端点,所以此时cur需要更新到左区间的中点,而right需指向原cur位置处(当cur=目标值时,cur可能是最终结果也可能不是,所以需要保存当前位置

③:连续序列的右端点

例如在 “1, 3, 5, 6, 6, 7, 9, 10” 中查找元素6的结束位置:

同样可以看成a、b两个区间,而我们要找的是区间a的右端点:

① cur > 目标值,cur需要指向左区间的中点,而右区间(7,9,10)被排除了,所以right指向cur的前一个位置;

② cur <= 目标值,由于我们要找的数连续序列的右端点,所以此时cur需要更新到右区间的中点,而left需指向原cur位置处(当cur=目标值时,cur可能是最终结果也可能不是,所以需要保存当前位置

📚中点选择 

在实际运用中,我们会发现,如果序列是偶数,中心点位置会有两个,此时我们需要考虑选择左中点还是右中点,同样分为三种情况:

①:目标元素(不重复)

在这种情况下中点的选择不会影响最终结果,因为目标元素不重复,所以选择左中点或右中点皆可

②:连续序列的左端点

在这种情况下,左右中点的选择会影响判断,看下面这种极端情况:

遍历到区间只剩两个元素时,cur应该更新成left(左中点)还是right(右中点)呢?

假如更新成right,由于cur>=目标值,right会指向cur(还是原位置),如此一来就会进入死循环,cur和right会一直在原地踏步,所以cur需要更新成左中点

③:连续序列的左端点

相反地, 当查询的是连续序列的右端点时,cur需更新成右中点:

在实际中时间复杂度为log(n)的算法并不多见,因为高效率的同时,门槛也越高,我们常了解到的二分算法只能在有序数组中使用,如果数组无序,我们就不能保证目标元素在左或右区间,就不能一次排除一般的元素

📚循环条件

循环条件是 left<right 还是 left<=right ? 其实就是考虑left、right相遇之后要不要进入循环

①:目标元素(不重复)

mid指针每次更新前都会进行一次判断,如果不是目标元素,则更新继续进入循环;当left、right相遇时,同样需要进行判断,如果还不是目标元素,则没有结果,这个判断和前面的判断一致,不需要特殊处理,所以循环条件是left<=right。

②:目标区间的端点

当left与right相遇后, 如果当前值不为目标值,那么更新left或right指针,会正常退出循环;如果当前值是目标值,那么left与right指针都会停留在当前位置,此时就进入了死循环。为了避免死循环,我们需要将循环条件设成left<right,并且在循环外部额外判断一次。

❓只能是有序数组吗

✅其实并不是,二分算法的巧妙就巧妙在,同样适用于一些无序的场景,后面会碰到具体例题。

📖二、具体运用 

1.⼆分查找

难度等级:⭐⭐⭐

题目链接:704. 二分查找 - 力扣(LeetCode)

题目描述:

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1


示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
算法思路

这种情况就是二分查找的基础玩法,查找一个不重复的目标元素, 从待遍历数组的中心位置开始,判断元素大小,如果>目标值,则更新到左区间中点;<目标值,更新到右区间中点。

算法流程

①:定义left、right、mid指针,mid指向left、right的中点位置(左右皆可)

②:判断mid指向元素

       a.>目标值,right指向mid前一个位置,更新mid

       b.<目标值,left指向mid后一个位置,更新mid

       c.=目标值,返回当前位置

③:执行到此处说明数组不存在目标值,返回空

代码
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0,right = nums.size()-1,mid = (left+right)/2;while(left<=right){if(nums[mid]>target) right = mid-1;else if(nums[mid]<target) left = mid+1;mid = (left+right)/2;if(nums[mid]==target) return mid;}return -1;}
};

2.查找元素的第⼀个和最后⼀个位置

难度等级:⭐⭐⭐⭐

题目链接:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

题目描述:

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]
算法思路

这道题目就是查找连续区间的端点的情况,查找左右端点需要分别进行。在查找时需要注意细节的处理:左右临界的选择、中点的选择 、循环条件(left<right)

算法流程

找区间左端点:

①:定义left、right、mid,mid指向left、right的左中点

②:判断mid元素

       a.<目标值,right指向mid后一个位置,更新mid

       b.>=目标值,left指向mid,更新mid

③:此时left、right相遇,进行判断,如果=目标值,记录下标;否则返回空

找区间右端点:

①:定义left、right、mid,mid指向left、right的右中点

②:判断mid元素

       a.>目标值,left指向mid前一个位置,更新mid

       b.<=目标值,right指向mid,更新mid

③:此时left、right相遇,进行判断,如果=目标值,记录下标;否则返回空

代码
class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {if(nums.size() == 0) return {-1,-1};int left = 0,right = nums.size()-1,mid;vector<int> ret = {-1,-1};while(left<right){mid = (left+right)/2;if(nums[mid]>=target) right = mid;else left = mid+1;}if(nums[left]==target) ret[0] = left;left = 0,right = nums.size()-1;while(left<right){mid = (left+right)/2 + 1;if(nums[mid]>target) right = mid-1;else left = mid;}if(nums[right]==target) ret[1] = right;return ret;}
};

3.x的平⽅根

难度等级:⭐⭐⭐

题目链接:69. x 的平方根 - 力扣(LeetCode)

题目描述:

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:

输入:x = 4
输出:2

示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
算法思路

找一个数的平方根,暴力枚举的思路是:在小于该数的数组中从第一个元素开始,判断当前元素的平方是否为目标元素。

用二分算法进行优化: 在小于该数的数组中,从中间元素开始判断,之后更新成左右区间的中点继续判断。

在这道题中并不需要真的建立一个数组,将left、right、mid就直接是对应的值

代码
class Solution {
public:int mySqrt(int x) {if(x==0) return 0;if(x==1) return 1;long long left = 1,right = x-1,mid;while(left<right){mid = (left+right)/2 + 1;if(mid*mid > (long long)x) right = mid-1;else left = mid;}return right;}
};

4.⼭峰数组的峰顶

难度等级:⭐⭐⭐⭐

题目链接:852. 山脉数组的峰顶索引 - 力扣(LeetCode)

题目描述:

给定一个长度为 n 的整数 山脉 数组 arr ,其中的值递增到一个 峰值元素 然后递减。

返回峰值元素的下标。

你必须设计并实现时间复杂度为 O(log(n)) 的解决方案。

示例 1:

输入:arr = [0,1,0]
输出:1

示例 2:

输入:arr = [0,2,1,0]
输出:1

示例 3:

输入:arr = [0,10,5,2]
输出:1
算法思路

这道题的暴力枚举思路很好想,从头遍历数组,与后一个元素进行判断,如果大于后一个元素,说明当前位置就是峰顶。

但是题目要求时间复杂度为O(logn) ,说明指引我们用二分算法思想解决:

但是这道题并不是一个有序数组,我们也不能将其变成有序数组(改变了峰顶的下标),那么还能用二分进行解决吗?

✅当然可以,实际上,二分算法并不局限于有序数组,在无序数组中,只要该数组具有二段性,就依然可以使用二分进行解决:

我们可以把数组看成两个区间,其中6是我们的峰顶,而寻找峰顶的问题就转化成了寻找连续区间a的右端点,如此以来就可以用二分进行解决了。

算法流程

①:定义left、right、mid,由于寻找的是区间右端点,根据极端情况判断,mid应该等于left、right的右中点;

②:判断mid元素

       a.<左元素,说明一定在b区间,则right指向mid前一个位置,更新mid

       b.>右元素,说明在a区间,此时可能是峰顶,left指向mid保存当前位置,更新mid

③:此时left、right相遇处即为峰顶

代码
class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int left=0,right=arr.size()-1,mid;while(left<right){mid = (left+right)/2 + 1;if(arr[mid]>arr[mid-1]) left = mid;else right = mid-1;}return left;}
};

5.点名

 难度等级:⭐⭐⭐

题目链接:LCR 173. 点名 - 力扣(LeetCode)

题目描述:

某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席,请返回他的学号。

示例 1:

输入: records = [0,1,2,3,5]
输出: 4

示例 2:

输入: records = [0, 1, 2, 3, 4, 5, 6, 8]
输出: 7
算法思路

这道题目是让我们寻找连续数组中缺失的元素,解决方法其实有很多,可以遍历数组,也可以用哈希表解决,但是这道题最快的方法还是二分查找:

同样可以将数组看成a,b两个区间,而题目最终是让我们寻找区间a的右端点,与上一道题目类似,最终我们需要返回的是 区间a的右端点 的下一个下标。

代码
class Solution {
public:int takeAttendance(vector<int>& r) {if(r[0]!=0) return 0;int left = 0,right = r.size()-1,mid;while(left<right){mid = (left+right)/2 + 1;if(r[mid]>mid) right=mid-1;else left=mid;}return left+1;}
};

📖三、总结

二分算法是一种经典且高效的查询方法,核心在于通过不断将查找范围缩小为一半,从而大幅降低查找的时间复杂度,从 O(n)优化为 O(log⁡n)。要注意的是,算法在实际应用中有几个关键细节,如左右临界的处理、中点的选择,以及避免死循环的循环条件设计。

我通过多个具体例题,我们可以体会到二分算法的灵活性和强大之处:其不仅适用于有序数组,还可在满足一定性质的无序场景中巧妙运用


以上就是【优选算法篇·第三章:二分算法】的全部内容,欢迎指正~ 

码文不易,还请多多关注支持,这是我持续创作的最大动力! 

相关文章:

【看海的算法日记✨优选篇✨】第三回:二分之妙,寻径中道

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 一念既出&#xff0c;万山无阻 目录 &#x1f4d6;一、算法思想 细节问题 &#x1f4da;左右临界 &#x1f4da;中点选择 &#x1f4da;…...

yolov5 解决:export GIT_PYTHON_REFRESH=quiet

当我们在第一次运行YOLOv5中的train.py程序时&#xff1a;可能会出现以下报错&#xff1a; This initial warning can be silenced or aggravated in the future by setting the $GIT_PYTHON_REFRESH environment variable. Use one of the following values: - quiet|q|silen…...

MongoDB聚合操作

1.聚合操作 聚合操作处理数据记录并返回计算结果。聚合操作组值来自多个文档&#xff0c;可以对分组数据执行各种操作以返回单个结果。聚合操作包含三类&#xff1a;单一作用聚合、聚合管道、MapReduce。 单一作用聚合&#xff1a;提供了对常见聚合过程的简单访问&#xff0c…...

Apple雷电5到底有多快?

在科技日新月异的今天&#xff0c;苹果公司始终走在技术创新的前沿。2023年9月12日&#xff0c;随着英特尔发布雷电5&#xff08;Thunderbolt 5&#xff09;规范&#xff0c;苹果迅速跟进&#xff0c;将其应用于自家的产品中。雷电5接口以其卓越的性能&#xff0c;彻底颠覆了我…...

项目快过:知识蒸馏 | 目标检测 |FGD | Focal and Global Knowledge Distillation for Detectors

公开时间&#xff1a;2022年3月9号 项目地址&#xff1a;https://github.com/yzd-v/FGD 论文地址&#xff1a;https://arxiv.org/pdf/2111.11837 知识蒸馏已成功地应用于图像分类。然而&#xff0c;目标检测要复杂得多&#xff0c;大多数知识蒸馏方法都失败了。本文指出&#…...

Spring Boot日志总结

文章目录 1.我们的日志2.日志的作用3.使用日志对象打印日志4.日志框架介绍5.深入理解门面模式(外观模式)6.日志格式的说明7.日志级别7.1日志级别分类7.2配置文件添加日志级别 8.日志持久化9.日志文件的拆分9.1官方文档9.2IDEA演示文件分割 10.日志格式的配置11.更简单的日志输入…...

PostgreSQL最常用数据类型-重点说明自增主键处理

简介 PostgreSQL提供了非常丰富的数据类型&#xff0c;我们平常使用最多的基本就3类&#xff1a; 数字类型字符类型时间类型 这篇文章重点介绍这3中类型&#xff0c;因为对于高并发项目还是推荐&#xff1a;尽量使用简单类型&#xff0c;把运算和逻辑放在应用中&#xff0c;…...

androidstudio 最新继承 proto kts 方式

在Android Studio中&#xff0c;如果你使用的是Kotlin DSL&#xff08;.kts文件&#xff09;来配置你的Gradle项目&#xff0c;并且你想集成Protocol Buffers&#xff08;Proto&#xff09;&#xff0c;你需要稍微调整你的配置方式。以下是如何在Kotlin DSL中配置Proto集成的步…...

【STM32学习】TB6612FNG驱动芯片的学习,驱动电路的学习

目录 1、TB6612电机驱动芯片 1.1如下是芯片的引脚图&#xff1a; 1.2如下图是电机的控制逻辑&#xff1a; 1.3MOS管运转逻辑 1.3典型应用电路 2、H桥驱动电路 2.1、单极模式 2.2、双极模式 2.3、高低端MOS管导通条件 2.4、H桥电路设计 2.5、自举电路 3、电气特性 3…...

【AI战略思考13】克服懒惰,保持专注,提升效率,不再焦虑

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 引言 我发现自己最近非常懒惰&#xff0c;浪费了很多时间&#xff0c;也容易分心&#xff0c;不够专注&#xff0c;效率低下&#xff0c;且每天都有点焦虑&#xff0c;因此制定了下面的要求和作息时间表。 目…...

基于Vue3+Element Plus 实现多表单校验

使用场景 表单校验在日常的开发需求中是一种很常见的需求&#xff0c;通常在提交表单发起请求前校验用户输入是否符合规则&#xff0c;通常只需formRef.value.validate()即可校验&#xff0c;但是&#xff0c;例如一些多步骤表单、动态表单、以及不同的用户角色可能看到不同的表…...

“岗位复合化、技能层次化” 高职大数据技术专业人才培养实践

在全球数字化浪潮的推动下&#xff0c;大数据技术已经成为引领社会进步和经济发展的核心动力。随着《关于深化现代职业教育体系建设改革的意见》等系列指导问文件的发布&#xff0c;我国高职大数据技术专业的教育正迎来全新机遇与挑战。这些政策不仅明确了职业教育改革的方向&a…...

Day2 生信新手笔记: Linux基础

一、基础知识 1.1 服务器 super computer 或 server 1.2 组学数据分析 组学数据&#xff1a;如基因组学、转录组学、蛋白质组学等&#xff1b; 上游分析&#xff1a;主要涉及原始数据的获取和初步处理&#xff0c;计算量大&#xff0c;消耗的资源较多&#xff0c;在服务器完…...

AI开发-数据可视化库-Seaborn

1 需求 概述 Seaborn 是一个基于 Python 的数据可视化库&#xff0c;它建立在 Matplotlib 之上。其主要目的是使数据可视化更加美观、方便和高效。它提供了高层次的接口和各种美观的默认主题&#xff0c;能够帮助用户快速创建出具有吸引力的统计图表&#xff0c;用于数据分析和…...

如何把Qt exe文件发送给其他人使用

如何把Qt exe文件发送给其他人使用 1、先把 Debug改成Release2、重新构建项目3、运行项目4、找到release文件夹5、新建文件夹&#xff0c;存放exe文件6、打开qt控制台串口7、下载各种文件8、压缩&#xff0c;发送压缩包给别人 1、先把 Debug改成Release 2、重新构建项目 3、运行…...

力扣103.二叉树的锯齿形层序遍历

题目描述 题目链接103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff…...

MOH: MULTI-HEAD ATTENTION AS MIXTURE-OFHEAD ATTENTION

当前的问题 多头注意力使用多个头部可以提高模型的精度。然而&#xff0c;并不是所有的注意力头都具有同样的重要性。一些研究表明&#xff0c;许多注意力头可以被修剪而不影响准确性。 此外&#xff0c;在多头注意中&#xff0c;每个注意头并行操作&#xff0c;最终输出是所…...

Linux的文件系统

这里写目录标题 一.文件系统的基本组成索引节点目录项文件数据的存储扇区三个存储区域 二.虚拟文件系统文件系统分类进程文件表读写过程 三.文件的存储连续空间存放方式缺点 非连续空间存放方式链表方式隐式链表缺点显示链接 索引数据库缺陷索引的方式优点&#xff1a;多级索引…...

力扣78题详解:C语言实现子集问题

力扣78题详解&#xff1a;C语言实现子集问题 题目描述 给定一个不含重复元素的整数数组 nums&#xff0c;返回其所有可能的子集&#xff08;幂集&#xff09;。 说明&#xff1a;解集不能包含重复的子集&#xff0c;顺序无关。 示例 输入&#xff1a;nums [1,2,3] 输出&am…...

按行数据拆分到工作表-Excel易用宝

有这样一份工作表&#xff0c;现在要对工作表按指定行数进行拆分&#xff0c;如果你还在选择数据区域复制粘贴到每个工作表中&#xff0c;那这样的效率也太低了。 按指定行数拆分工作表&#xff0c;就用易用宝。 单击Excel易用宝&#xff0c;合并与拆分&#xff0c;拆分工作表…...

.net core 创建linux服务,并实现服务的自我更新

目录 创建服务创建另一个服务&#xff0c;用于执行更新操作给你的用户配置一些systemctl命令权限 创建服务 /etc/systemd/system下新建服务配置文件&#xff1a;yourapp.service&#xff0c;内容如下&#xff1a; [Unit] Descriptionyourapp Afternetwork.target[Service] Ty…...

无人机的起降装置:探索起飞和降落的秘密 !

一、起降系统的运行方式 起飞方式 垂直起飞&#xff1a;小型无人机通常采用垂直起飞方式&#xff0c;利用螺旋桨产生的升力直接从地面升起。这种方式适用于空间有限或需要快速起飞的场景。 跑道起飞&#xff1a;大型无人机或需要较长起飞距离的无人机&#xff0c;可能会采用…...

Apache Airflow 快速入门教程

Apache Airflow已经成为Python生态系统中管道编排的事实上的库。与类似的解决方案相反&#xff0c;由于它的简单性和可扩展性&#xff0c;它已经获得了普及。在本文中&#xff0c;我将尝试概述它的主要概念&#xff0c;并让您清楚地了解何时以及如何使用它。 Airflow应用场景 …...

数学题转excel;数学题库;数学试卷转excel;大风车excel

一、数学试卷转excel 有些需要刷题的朋友&#xff0c;需要将题库数学题转为excel格式&#xff0c;便于管理 前端时间帮一位朋友实现了数学题转excel&#xff0c;包括选择题、填空题、分析题 示例&#xff1a; 二、问题 数学题是最难以处理的试题&#xff0c;理由如下 1、有…...

【C++】类和对象(下)

目录 前言 一、再探构造函数 二、类型转换 三、static 成员 四、友元 五、内部类 六、匿名对象 七、对象拷贝时的编译器优化 总结 前言 本文主要内容&#xff1a;构造函数的再探--初始化列表、内置类型与自定义类型之间的转换、类的static成员、友元、内部类、匿名对…...

vue多页面应用集成时权限处理问题

在多页面应用&#xff08;MPA&#xff09;中&#xff0c;权限管理通常会涉及到每个页面的访问控制、身份验证、以及权限校验。以下是几种常见的权限处理方式&#xff1a; 1. 前端路由权限控制 原理&#xff1a;虽然是多页面应用&#xff0c;通常每个页面会独立加载和渲染&…...

输出保留3位小数的浮点数

输出保留3位小数的浮点数 C语言代码C代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 读入一个单精度浮点数&#xff0c;保留3位小数输出这个浮点数。 输入 只有一行&#xff0c;一个单精度浮点数。 输出 也只有一…...

openssl的运用

一、概述 Opssl是一个用于TLS/SSL协议的工具包&#xff0c;也是一个通用密码库。 包含了国密sm2 sm3 sm4&#xff0c;包含了对称加密&#xff0c;非对称加密&#xff0c;单项散列&#xff0c;伪随机、签名&#xff0c;密码交换&#xff0c;证书等一些算法库。 为了深层次的学习…...

C++STL之vector(超详细)

CSTL之vector 1.vector基本介绍2.vector重要接口2.1.构造函数2.2.迭代器2.3.空间2.3.1.resize2.3.2.capacity 2.4.增删查找 3.迭代器失效4.迭代器分类 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f68…...

RabbitMQ消息可靠性保证机制5--消息幂等性处理

RabbitMQ层面有实现“去重机制”来保证“恰好一次”吗&#xff1f;答案是没并没有&#xff0c;而且现在主流的消息中间件都没有实现。 一般解决重复消息的办法是&#xff1a;在消费端让我们消费消息操作具有幂等性。 幂等性问题并不是消息系统独有&#xff0c;而是&#xff0…...

24/12/1 算法笔记<强化学习> 创建Maze交互

我们今天制作一个栅格的游戏。 我们直接上代码教学。 1.载入库和查找相应的函数版本 import numpy as np import time import sysif sys.version_info.major 2:import Tkinter as tk else:import tkinter as tk 2.设置长宽和单元格大小 UNIT 40 MAZE_H 4 MAZE_W 4 3.初始…...

c++:模版 template

一、模版 1.格式&#xff1a; template <typname T> 2.实现 2.1自动推导 模板只对紧跟在后面的第一行代码有效&#xff0c;如果后面还想定义模板函数需要重新定义模板 #include <iostream> #include <string>template <typename T> void Print(T v…...

javascript切换类、删除类、修改类以及增加类

在JavaScript中&#xff0c;操作DOM元素的类&#xff08;class&#xff09;是一个常见的操作。以下是一些基本的方法来切换类、删除类、修改类以及增加内联样式&#xff1a; 切换类&#xff08;Toggle Class&#xff09; 切换类意味着如果类存在则移除它&#xff0c;如果不存…...

区块链学习笔记(2)--区块链的交易模型part1

模型基础 区块链的tx分为两种模型&#xff0c;分别是比特币为代表的UTXO&#xff08;Unspent Transaction Output&#xff09;模型&#xff0c;和以太坊为代表的Account模型。前者适用于货币记账&#xff0c;后者适用于链上应用。 UTXO模型 类似于现金的交易模型 一个tx包含…...

反射知识总结

狂神说 反射的功能&#xff1a; 类加载内存分析 类加载的时候&#xff0c;class对象就形成了。 类无论有多少对象&#xff0c;class对象只有一个。 获取类对象三种方式 反射&#xff0c;就是通过api获取一个类的类对象&#xff1a; 有三种方式&#xff1a; 方法一&#xf…...

selenium部署分布式 UI 自动化测试环境-Docker

一、根据selenium/hub官网的配置信息&#xff0c;进行配置。 How to run this image The Hub and Nodes will be created in the same network and they will recognize each other by their container name. A Docker network⁠ needs to be created as a first step.Create …...

算法刷题Day5: BM52 数组中只出现一次的两个数字

描述&#xff1a; 一个整型数组里除了两个数字只出现一次&#xff0c;其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 要求&#xff1a;空间复杂度 O(1)&#xff0c;时间复杂度O(n)。 题目传送门 is here 思路&#xff1a; 方法一&#xff1a;最简单的思路就…...

使用docker-compose部署搜索引擎ElasticSearch6.8.10

背景 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它被广泛用于实时数据搜索、日志分析、全文检索等应用场景。 Elasticsearch 支持高效的全文搜索&#xff0c;并提供了强大的聚合功能&#xff0c;可以处理大规模的数据集并进行快速…...

多线程篇-5--线程分类(线程类型,springboot中常见线程类型,异步任务线程)

常见的线程类型包括用户线程&#xff08;User Threads&#xff09;、守护线程&#xff08;Daemon Threads&#xff09;、主线程&#xff08;Main Thread&#xff09;、工作线程&#xff08;Worker Threads&#xff09;和线程池中的线程。 一、用户线程&#xff08;User Thread…...

详解高斯消元

详解高斯消元 好东西,可以求所有一次方程组的解。 \color {red} 好东西,可以求所有一次方程组的解。 好东西,可以求所有一次方程组的解。 前置知识 一般消元法的公理: 两方程互换,解不变; 一方程乘以非零数 k k k,解不变; 一方程乘以数 k k k加上另一方程,解不变。 …...

【Python网络爬虫笔记】5-(Request 带参数的get请求) 爬取豆瓣电影排行信息

目录 1.抓包工具查看网站信息2.代码实现3.运行结果 1.抓包工具查看网站信息 请求路径 url:https://movie.douban.com/typerank请求参数 页面往下拉&#xff0c;出现新的请求结果&#xff0c;参数start更新&#xff0c;每次刷新出20条新的电影数据 2.代码实现 # 使用网络爬…...

泷羽sec- shell编程(8) until循环以及函数基本创建调用 学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

Apache Flink从Kafka中消费商品数据,并进行商品分类的数量统计题

使用Apache Flink从Kafka中消费商品数据&#xff0c;并进行商品分类的数量统计是一个典型的流处理任务。以下是一个详细的步骤指南和示例代码&#xff0c;帮助你实现这一功能。 ### 前提条件 1. **安装Flink**&#xff1a;确保你的环境中已经安装了 Apache Flink。 2. **安装…...

Ubuntu 安装 MariaDB

安装 MariaDB具体步骤 1、更新软件包索引&#xff1a; sudo apt update2、安装 MariaDB 服务器&#xff1a; sudo apt install mariadb-server3、启动 MariaDB 服务&#xff08;如果未自动启动&#xff09;&#xff1a; sudo systemctl start mariadb4、设置 MariaDB 开机启…...

GPT打字机效果—— fetchEventSouce进行sse流式请求

EventStream基本用法 与 WebSocket 不同的是&#xff0c;服务器发送事件是单向的。数据消息只能从服务端到发送到客户端&#xff08;如用户的浏览器&#xff09;。这使其成为不需要从客户端往服务器发送消息的情况下的最佳选择。 const evtSource new EventSource(“/api/v1/…...

Leetcode 3373. Maximize the Number of Target Nodes After Connecting Trees II

Leetcode 3373. Maximize the Number of Target Nodes After Connecting Trees II 1. 接替思路2. 代码实现 题目链接&#xff1a;3373. Maximize the Number of Target Nodes After Connecting Trees II 1. 接替思路 这一题和前一题Leetcode 3372其实整体思路上并没有啥太大…...

JS的魔法三角:constructor、prototype与__proto__

在JavaScript中&#xff0c;constructor、prototype和__proto__是与对象创建和继承机制紧密相关的三个概念。理解它们之间的关系对于掌握JavaScript的面向对象编程至关重要。下面将详细介绍这个魔法三角&#xff1a; 1. constructor 定义&#xff1a;constructor是一个函数&am…...

用c语言完成俄罗斯方块小游戏

用c语言完成俄罗斯方块小游戏 这估计是你在编程学习过程中的第一个小游戏开发&#xff0c;怎么说呢&#xff0c;在这里只针对刚学程序设计的学生&#xff0c;就是说刚接触C语言没多久&#xff0c;有一点功底的学生看看&#xff0c;简陋的代码&#xff0c;简陋的实现&#xff0…...

Leetcode打卡:N皇后

执行结果&#xff1a;通过 题目&#xff1a;51 N皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#…...

位运算在嵌入式系统开发中的应用

目录 一、数据存储与节省 “绝技” 1.1. 传感器数据存储挑战 1.2. 位运算解决方案 1.2.1. 数据整合 1.2.2. 数据提取 1.3. 收益分析 二、硬件控制 “精准操纵术” 2.1. 位运算操控硬件寄存器的实例 2.2. 位运算在硬件控制中的优势 2.3. 电机驱动芯片寄存器控制示例 …...