【优选算法-二分查找】二分查找算法解析:如何通过二段性优化搜索效率
算法 | 相关知识点 | 可以通过点击 | 以下链接进行学习 | 一起加油! |
---|---|---|---|---|
双指针 | 滑动窗口 |
在本篇文章中,我们将深入解析二分查找算法的核心原理。从基本概念到实际应用,带你了解如何利用二分查找高效定位元素,提升搜索效率。无论你是刚接触算法的新手,还是想优化代码性能的老手,二分查找都是你不可忽视的强大工具!
🌈个人主页:是店小二呀
🌈C/C++专栏:C语言\ C++
🌈初/高阶数据结构专栏: 初阶数据结构\ 高阶数据结构
🌈Linux专栏: Linux
🌈算法专栏:算法
🌈Mysql专栏:Mysql
🌈你可知:无人扶我青云志 我自踏雪至山巅
文章目录
- 34. 在排序数组中查找元素的第一个和最后一个位置(重要)
- 二段性(重要/必备知识)
- 1.查找左端点
- 2.循环判断条件
- 3. left和right移动方式
- 3.求中点操作
- 4.总结二分模板
- 69.x 的平方根
- 35.搜索插入位置
- 69.山脉数组的峰顶索引
- 162. 寻找峰值
- 153. 寻找旋转排序数组中的最小值
- LCR 173. 点名
34. 在排序数组中查找元素的第一个和最后一个位置(重要)
【题目】:34. 在排序数组中查找元素的第一个和最后一个位置
如果题目为"在排序数组中查找元素",很自然可以想到朴素二分查找,根据中间数值讨论,但是"朴素二分"不适合更有层度题目,比如说这道题目。
首先如果使用朴素二分单凭一个中间值,很难得知第一个和最后一个位置。如果出现全部是相同元素的情况,会导致时间复杂度降成同暴力解法般,对此我们应该借助"二段性"优化二分查找策略
【算法思路】
二段性(重要/必备知识)
在二分查找算法中,“二段性”通常指的是数组被分成两个部分进行查找,每次都根据某种条件进行判断、决定在哪一部分继续搜索。简单来说,二分查找通过将问题逐步缩小到两个子问题中的一个,从而高效地找到目标元素。
1.查找左端点
通过绘图分析数组中的元素与目标值(target)之间的关系,我们可以将数组划分为两部分:左侧部分包含所有小于目标值的元素,右侧部分则包含所有大于或等于目标值的元素。这一划分是基于二分性质进行的。
【细节处理】
关于这部分细节,属于二分查找容易导致死循环的问题所在。
2.循环判断条件
这里有两种循环判断条件,必须要选择第一种,而不是第二种。如果选择第二种会导致死循环。
第一种:while(left < right)
第二种:while(left <= right)
选择第一种理由
【理由一】:
这里只能选择第一种while(left < right)
,否则就会死循环。比如left = mid 或者 right = mid
,当你判断条件为left <= right
,left == right
一直为真,导致死循环
【理由二】:
left ==right的时候,就是最终结构,无需判断。图中有三种情况佐证:有结果,全大于t,全小于t
3. left和right移动方式
通过二分法将数组划分为两部分。在此过程中,需要根据目标值与当前划分区域的关系来判断left
和right
的移动方式。
通过绘图分析,如果目标值位于左侧且mid
落在左侧,则left
应设置为mid
,而不是mid + 1
,以避免错过目标值;如果mid
落在右侧,则由于目标值不在右侧,right
应设置为mid - 1
同理可得,当目标位于右侧,如果mid
落在右侧,则right
应设置为mid
,而不是mid - 1
,以避免错过目标值;如果mid
落在左侧,则left
应设置为mid + 1
,因为目标值不在左侧。
3.求中点操作
首先考虑到 right 可能会超过Max值,所以会先采用 left + (right - left) / 2。在二分查找中,求中点操作有两个方式,在不同场景选择适合的方式,否则容易导致死循环
【第一种方式】: mid = left + (right - left) / 2,会导致mid落在左侧
【第二种方式】:mid = left + (right - left + 1) / 2,会导致mid落在右侧
例如,求左端点时,如果left = mid
,right = mid - 1
,根据这两个变量的移动规律,若使用第一种方式(left = mid + 1
),会导致死循环,因此应使用第二种方式(left = mid
)。同理,求右端点时,若left = mid + 1
,right = mid
,应根据相应的规则调整边界,避免死循环并确保正确找到右端点,选择第一种方式。
【代码实现】
class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;int begin = 0;if(nums.size() == 0) return {-1,-1};//求解左端点while(left < right){int mid = left + (right - left)/2;if(nums[mid] < target) left = mid + 1;else right = mid;}if(target != nums[left]) return {-1,-1};else begin = left;left = 0,right = nums.size() - 1;//求解右端点while(left < right){int mid = left + (right - left + 1)/2;if(nums[mid] > target) right = mid - 1;else left = mid;}return {begin,left};}
};
4.总结二分模板
通过不断刷题,我们会发现很多题目都是相似的。如果忘记了某些常用模板,也可以通过上述方式重新推导。关键在于如何识别题目中的二分性质,从而将问题划分为两个区间。
69.x 的平方根
【题目】:69. x 的平方根
【算法思路】
1.暴力查找
通过枚举从 0 到 x
之间的每个整数 i
,判断是否满足条件:
这里不需要考虑是否枚举到 x / 2
或 x / 2 + 1
,因为一旦找到结果就直接返回,后续的情况不再进行判断。过多的区间研究不仅浪费时间,还容易出错。
- 如果
i * i == x
,直接返回i
; - 如果
i * i > x
,说明前一个数i-1
的平方已经超过了x
,因此返回i - 1
。
由于 i * i
可能会超过 int
的最大值,所以应使用 long long
类型来存储变量。
class Solution {
public:int mySqrt(int x) {// 使用 long long 来避免溢出long long i = 0;for (i = 0; i <= x; i++) {// 如果平方等于 x,返回 iif (i * i == x) return i;// 如果平方大于 x,返回 i - 1if (i * i > x) return i - 1;}// 为了确保所有路径有返回值return -1;}
};
2.二分查找
设x的平分根的最终结果为ret。分析ret左右两侧数据的特点,从而发现二段性。
【代码实现】
class Solution {
public:int mySqrt(int x){int left = 1, right = x;if(x < 1) return 0;//处理下边界情况while(left < right){long long mid = left + (right - left + 1)/2;if(mid * mid <= x) left = mid;else right = mid - 1;}return left;}
};
35.搜索插入位置
【题目】:35. 搜索插入位置
插入位置是第一个大于目标值的数,或者是最后一个数据。如果当前的数大于或等于目标值,那么这里就是我们所需的二分区间。如果没有元素,在最后一个位置,特殊情况特殊处理。
【代码实现】
class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while(left < right){int mid = left + (right - left)/2;if(nums[mid] < target) left = mid +1 ;else right = mid;}if(nums[left] < target) return right + 1;else return right;}
};
这里需要判断下,如果达到最后一个位置情况(nums[left] < target
。
69.山脉数组的峰顶索引
【题目】:69. 山脉数组的峰顶索引
【算法思路】
通过绘图分析元素之间的大小关系,从而确定二分法的划分区间。
【代码实现】
class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int left = 0, right = arr.size()-1;while(left < right){int mid = left + (right - left + 1) / 2;if(arr[mid - 1] <= arr[mid]) left = mid;else right = mid - 1;}return left;}
};
【细节分析】
1.arr[mid - 1] <= arr[mid]
是否会越界?
在 arr[mid - 1]
中,mid
的最小值是 1,因为 mid = left + (right - left + 1) / 2
,而 left
从 0 开始,mid
永远不会是 0。arr[mid - 1]
访问的是 mid
左边的元素,因此不会越界。
2.如果采用arr[mid + 1]
后果
如果是 arr[mid + 1]
,那会导致在 mid
达到数组最后一个元素时越界,但是这种情况在这个算法中并没有发生,因为我们始终是在 left
到 right
的范围内进行查找,确保 mid + 1
不会超出界限。
162. 寻找峰值
【题目】:162. 寻找峰值
解法一:暴力解法
解法二:滑动窗口
通过两个点的分析,如果arr[i]>arr[i+1]
,呈现下降趋势,可以判断左边一定有峰值,但是右边不一定有峰值,可能是直接到负无穷或者另起一峰。同理arr[i]<arr[i+1]
,呈现上升趋势,可以判断右边一定有峰值,但是左边不一定有峰值。
我们可以根据1,2种情况去分出二段性,就可以使用二分查找。
如果arr[mid] > arr[mid+1]
,则左侧一定有我们的结果,只需righ
t等于mid
,而arr[mid] < arr[mid+1]
,则右侧一定有我们的结果,left
等于mid +1
去查找。
【代码实现】
class Solution {
public:int findPeakElement(vector<int>& nums){int left = 0,rigth = nums.size() - 1;while(left < rigth){int mid = left + (rigth - left + 1)/2;if(nums[mid - 1] < nums[mid]) left = mid;else rigth = mid - 1;}return left;}
};
【个人思考】
关于left和right移动规律,需要通过绘图去分析走向。这里很好通过表示了目标值是否存在作为突破口,发现二段性。所以具体情况还是需要具体分析的。
153. 寻找旋转排序数组中的最小值
【题目】:153. 寻找旋转排序数组中的最小值
示例 1:
输入:nums = [3,4,5,1,2] 输出:1 解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。
示例 2:
输入:nums = [4,5,6,7,0,1,2] 输出:0 解释:原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。
解法一:暴力解法
暴力查找最小值,时间复杂度O(N)。暴力解法慢,是没有利用这个数组的特性,经过旋转的有序数组。
解法二:二分查看
画张曲线图,寻找二段性,以D点nums[n-1]
为参照物,AB区域是严格大于D点,CD区域是小于等于D点的。
通过mid在某个区间如何移动,去推到两个变量的移动方式。
【代码实现】
class Solution {
public:int findMin(vector<int>& nums) {int left = 0,right = nums.size() - 1;int x =nums[right];while(left < right){int mid = left + (right - left)/2;if(nums[mid] > x) left = mid + 1;else right = mid;}return nums[left];}
};
【疑问:选择A点的值作为参照物】
那么x = nums[0],通过绘图和mid落点去推导left和right移动方式即可。
LCR 173. 点名
【题目】:LCR 173. 点名
1.常见解法
- 哈希表法
创建一个大小为 n+1 的哈希表,遍历原始数组并将元素填入哈希表,然后检查哪个位置没有被填充,这就是缺失的数字。- 直接遍历法
直接遍历原数组,找到缺失的元素。- 位运算法 (XOR)
使用位运算(XOR)来抵消重复出现的数字,最终剩下的就是缺失的数字。- 数学法 (高斯求和公式)
利用等差数列的求和公式,计算从 0 到 n 的总和与数组中所有元素的和之间的差值,得出缺失的数字。这些方法的时间复杂度都是 O(n),因此适合处理大规模数据。
2.二分查找
【思考:0 到 n-1,为什么长度是 n-1?这个问题常见于面试中,面试官可能会与你探讨是否还有其他解法。】
这里可以根据图下,发现二段性使用二分查找。
通过比较数值与对应下标的关系,作为二分法的判定标准,从而划分搜索区间。
class Solution {
public:int takeAttendance(vector<int>& records) {int left = 0,rigth = records.size() - 1;while(left < rigth){int mid = left + (rigth - left) / 2;if(records[mid] == mid) left = mid + 1;else rigth = mid;}if(records[left] == left) return left + 1;else return left;}
};
快和小二一起踏上精彩的算法之旅!关注我,我们将一起破解算法奥秘,探索更多实用且有趣的知识,开启属于你的编程冒险!
相关文章:
【优选算法-二分查找】二分查找算法解析:如何通过二段性优化搜索效率
算法相关知识点可以通过点击以下链接进行学习一起加油!双指针滑动窗口 在本篇文章中,我们将深入解析二分查找算法的核心原理。从基本概念到实际应用,带你了解如何利用二分查找高效定位元素,提升搜索效率。无论你是刚接触算法的新手…...
如何搭建spark yarn模式的集群
一、基础环境准备 安装JDK 1.8 所有节点需安装JDK并配置环境变量,确保JAVA_HOME正确指向安装路径14。部署Hadoop集群 安装Hadoop(推荐3.x版本),配置YARN资源管理器4。在yarn-site.xml中启用资源调度: <pro…...
OpenResty深度解析:从卓伊凡的”隐形主流”论看其深度原理与应用生态-卓伊凡
OpenResty深度解析:从卓伊凡的”隐形主流”论看其深度原理与应用生态-卓伊凡 一、OpenResty技术概述:悄然成为基础设施的”隐形冠军” 1.1 OpenResty的”附带安装”现象 正如技术观察者卓伊凡在其《现代Web基础设施的隐形架构》一文中首次提出的观点:”OpenResty正在以一…...
CSS 预处理器与模块化:Sass/LESS 实战技巧
CSS 预处理器与模块化:Sass/LESS 实战技巧 引言 在现代前端开发中,CSS 预处理器已成为构建可维护、可扩展前端项目的核心工具。随着项目规模扩大,原生 CSS 的局限性日益明显:缺乏变量、嵌套结构和模块化机制导致代码冗余、难以维…...
杰里芯片 7083G 之通话数据dump
前期准备工作: 硬件:杰里test_audio 开发板 读卡器 SD卡 软件:dump 脚本 通过网盘分享的文件:PCM写卡工具使用说明和数据导出脚本.rar 链接: https://pan.baidu.com/s/18fSxMPe-gmPtHlJekUK4yw 提取码: c54i 制作调试固件&…...
Redis ⑦-set | Zset
set类型基本介绍 set 为集合,该集合为无序集合,可以存储多个不同的数据类型,包括字符串、整数、浮点数等。 集合中的元素是唯一的,不可重复。 set类型常用命令 SADD SADD key member [member...]集合中的值称为 member将一个…...
在线图书管理系统的结构化需求分析过程讲解
一、引言 结构化分析是一种面向数据流进行需求分析的方法,其总体步骤包括: 1. 需求获取; 2. 分析建模; 3. 需求文档化; 4. 需求验证与评审。 本文将以在线图书管理系统为例,详细展示按照这些步骤进行…...
【Linux】基于环形队列的生产消费者模型
个人主页~ 基于环形队列的生产消费者模型 一、POSIX信号量1、概述2、调用接口(一)初始化信号量(二)销毁信号量(三)等待信号量(四)发布信号量 3、在环形队列中的作用 二、基于环形队列…...
如何实现Kafka的Exactly-Once语义?
Kafka 的 Exactly-Once(精确一次)语义是分布式消息系统中最高等级的数据一致性保证,包含三个层面的含义: 消息不会丢失消息不会重复消费消息处理结果具有确定性 模式局限性: 这里模式有个问题,会导致性能…...
x-cmd install | Orbiton:极简至上的终端文本编辑器与轻量级 IDE
目录 核心特点安装适用场景优势 厌倦了臃肿复杂的 IDE?渴望一个轻巧、快速、专注的编码环境?Orbiton,一款极简主义的终端文本编辑器与轻量级 IDE,将带给你前所未有的编码体验。 核心特点 极简主义,专注编码࿱…...
WSL释放空间
在 WSL (Windows Subsystem for Linux) 中,Linux 发行版可能会占用越来越多的磁盘空间,即使删除文件后,空间也可能不会自动释放。这是因为 WSL 使用虚拟硬盘(VHDX 文件)来存储 Linux 文件系统,而 Windows 不…...
51c大模型~合集122
我自己的原文哦~ https://blog.51cto.com/whaosoft/13877107 #PHYBench 北大物院200人合作,金牌得主超50人!PHYBench:大模型究竟能不能真的懂物理? 本项目由北京大学物理学院朱华星老师、曹庆宏副院长统筹指导。基准设计、…...
Flink HA 总结
前言 总结 Flink HA 版本 Flink 1.15.3、1.15.4 官方文档 https://nightlies.apache.org/flink/flink-docs-release-1.19/zh/docs/deployment/ha/overview/ 由官方文档可知: HA 是对于 JobManager 的故障恢复,默认情况下,每个 Flink 集…...
从代码学习机器学习 - UMAP降维算法 scikit-learn版
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、UMAP降维算法介绍二、代码实践三、代码中可调整的降维参数总结前言 在机器学习和数据科学领域,我们经常会遇到高维数据。高维数据虽然包含了丰富的信息,但也带来了“维度灾难”的问题,…...
除了Object.freeze(),JavaScript中还有哪些优化性能的对象限制方法?
除了Object.freeze(),JavaScript中还有哪些优化性能的对象限制方法? 前言 在前端开发中,性能优化是一个永恒的话题。当我们处理大型对象或频繁操作对象时,JavaScript 提供的对象限制方法能有效提升代码执行效率。众所周知的 Obje…...
实战指南:搭建AIRIOT全场景智慧养老管理平台系统全流程解析
依托AIRIOT智慧系统搭建平台构建的AIRIOT智慧养老管理系统,通过管理驾驶舱、健康管理、生活服务与安全监控、综合管理五大核心模块,构建覆盖“数据感知→智能分析→服务联动→安全保障”的全链路养老管理体系,助力养老机构实现精细化、智能化…...
【硬件系统架构】哈佛架构
一、引言 在计算机科学的浩瀚宇宙中,计算机体系结构犹如星辰般繁多且各有独特光芒。哈佛架构便是其中一颗耀眼的明星,它在众多计算机体系结构中占据着独特而重要的地位。从计算机技术的萌芽期一路走来,哈佛架构不断发展演变,在不同…...
晶振PCB设计核心要点与规范
一、布局与走线设计 位置优先原则: 晶振紧邻主控芯片(如MCU、FPGA)时钟输入引脚,最大走线长度≤10mm。 远离高速信号线(如DDR、USB差分对),间距≥3倍线宽,避免串扰。 对称走线&am…...
Dyna螺栓预紧力
01 前处理 1.1 几何模型构建 用ls-prepost进行建模,模型构建如图 1所示。 图 1 模型 1.2 网格模型构建 在ls-prepost中进行网格划分,最终效果图如图 2所示。 图 2 网格模型 1.3 有限元模型构建 1.3.1 材料定义 设置两种材料,均使用线弹…...
排序算法详解笔记
评价维度 运行效率就地性稳定性 自适应性:自适应排序能够利用输入数据已有的顺序信息来减少计算量,达到更优的时间效率。自适应排序算法的最佳时间复杂度通常优于平均时间复杂度。 是否基于比较:基于比较的排序依赖比较运算符(…...
喷泉码技术在现代物联网中的应用 设计
喷泉码技术在现代物联网中的应用 摘 要 喷泉码作为一种无速率编码技术,凭借其动态生成编码包的特性,在物联网通信中展现出独特的优势。其核心思想在于接收端只需接收到足够数量的任意编码包即可恢复原始数据,这种特性使其特别适用于动态信道和多用户场景。喷泉码的实现主要…...
LVDS系列10:Xilinx 7系可编程输入延迟(三)
这节继续讲解IDELAYE2和IDELAYCTRL的VARIABLE模式、VAR_LOAD模式和VAR_LOAD_PIPE模式的仿真测试; VARIABLE模式使用: VARIABLE模式需要使用INC和CE端口控制抽头值的递增递减变化; 测试代码如下: module top_7series_idelay( i…...
QT:自定义ComboBox
实现效果: 实现combobox的下拉框区域与item区域分开做UI交互显示。 支持4种实现效果,如下 效果一: 效果二: 效果三: 效果四: 实现逻辑: ui由一个toolbutton和combobox上下组合成,重点在于combobox。 我设置了4种枚举,ButtonWithComboBox对应效果一;OnlyButt…...
Python爬虫学习路径与实战指南 02
一、进阶技巧与工具 1、处理复杂反爬机制 验证码破解(谨慎使用): 简单图像验证码:使用 pytesseract(OCR识别) PIL 处理图像。 复杂验证码:考虑付费API(如打码平台)。 …...
Crawl4AI,智能体网络自动采集利器
Crawl是一个强大的工具,它赋予AI智能体更高的效率和准确性执行网络爬取和数据提取任务。其开源特性、AI驱动的能力和多功能性,使其成为构建智能且数据驱动智能体的宝贵资产,告别繁琐: 爬虫新宠 crawl4ai,数行代码搞定数据采集,AI …...
C语言实现卡ID启用排序
任务: typedef struct {uint8_t bindflag; uint8_t userCardNumber; //当前用户卡的数据uint32_t userCardId[7];//当前6个用户的卡ID }USER_NFC;结构体中bindflag从高到低的的高七位bit表示数组userCardId中低到高卡ID的启用禁用状态,userC…...
html css js网页制作成品——HTML+CSS甜品店网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
漫反射实现+逐像素漫反射+逐像素漫反射实现
标准光照的构成结构 自发光:材质本身发出的光,模拟环境使用的光 漫反射光:光照在粗糙材质后,光的反射方向随机,还有一些光发生了折射,造成材质 表面没有明显的光斑。 高光反射光:光照到材质表面…...
nginx代理websocket时ws遇到仅支持域名访问的处理
最终改造点 proxy_set_header Host 这一行 未改之前遇到的问题: nginx 日志显示 https://aaa.bbbb.cn:7413 被解析成了 IP 地址,这通常是因为 DNS 解析的结果被缓存或某些中间层(如负载均衡器、防火墙等)将域名替换为 IP 地址。…...
具身智能:从理论突破到场景落地的全解析
一、具身智能:重新定义 “智能” 的物理边界 (一)概念本质与核心特征 具身智能(Embodied Intelligence)是人工智能与机器人学深度融合的前沿领域,其核心在于通过物理实体与环境的动态交互实现智能行为。区…...
用Postman验证IAM Token的实际操作
当我们需要用Postman发送一个最简单的请求去验证Token的时候我们该怎么办? 【一、步骤】 步骤1:打开Postman,新建一个GET请求 请求地址填: https://iam.cn-north-4.myhuaweicloud.com/v3/auth/projects 解释一下:…...
CH592/CH582 触摸按键应用开发实例讲解
一. 触摸原理介绍 1. 触摸按键电容产生原理 一般应用中,可用手指与触摸板的电容模型简化代替人体与触摸板的电容模型,如图所示。 沁恒微电子的电容触摸按键检测方案主要有以下两种: (1) 电流源充电方案。 低功耗蓝牙系列、通用系列 MCU 使…...
为什么选择有版权的答题pk小程序
选择有版权的答题PK小程序主要有以下原因: 一、避免法律风险 随着国家对知识产权保护力度的加大,使用无版权的答题PK小程序可能会引发侵权纠纷。一旦被原作者或版权方发现,使用者可能会面临法律诉讼,需要承担相应的法律责任&…...
Java生成微信小程序码及小程序短链接
使用wx-java-miniapp-spring-boot-starter 生成微信小程序码及小程序短链接 在pom.xml文件中引入依赖 <dependency><groupId>com.github.binarywang</groupId><artifactId>wx-java-miniapp-spring-boot-starter</artifactId><version>4.7…...
从普查到防控:ArcGIS洪水灾害全流程分析技术实战——十大专题覆盖风险区划/淹没制图/水文分析/洪水分析/淹没分析/项目交流,攻克防洪决策数据瓶颈!
🔍 防范未然的关键一步:洪水灾害普查是筑牢防洪安全防线的基础。通过全面普查,可以精准掌握洪水灾害的分布、频率和影响范围,为后续的防洪规划、资源调配和应急响应提供详实的数据支持。这有助于提前识别潜在的高风险区域…...
Ubuntu安装SRS流媒体服务
通过网盘分享的文件:srs 链接: https://pan.baidu.com/s/1tdnxxUWh8edcSnXrQD1uLQ?pwd0000 提取码: 0000 官网地址:Build | SRS 将百度网盘提供的srs 和 conf 下载或上传到指定服务器 # 安装需要的依赖包 sudo apt install -y cmake tclsh unzip gcc…...
设计模式(行为型)解释器模式
定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。这意味着我们能够针对特定领域的问题,构建一套专属的语言体系,并通过解释器对使用该语言描述的问题进行解析和处…...
海外独立站VUE3加载优化
主要有几个明显问题 1. 请求数量太多(139 requests) 网页请求了*大量 JS 文件*(都是 index-xxxx.js),而且每个文件都比较小。 每次建立请求都有 TCP 连接开销(特别是 HTTP/1.1),导…...
关于windows API 的键鼠可控可测
相关函数解释 GetAsyncKeyState 是 Windows API 中的一个函数,用于判断某个虚拟键是否被按下。GetAsyncKeyState(VK_ESCAPE) 专门用于检测 Esc 键的状态。下面为你详细介绍其用法: 函数原型 cpp SHORT GetAsyncKeyState( int vKey ); 参数 vKey&a…...
普发ASM392EUV检漏仪维修说明手测内容可目录
普发ASM392EUV检漏仪维修说明手测内容可目录...
Python pip下载包及依赖到指定文件夹
要使用pip下载包及其所有依赖到指定文件夹,请按照以下步骤操作: 步骤说明 使用pip download命令:该命令用于下载包及其依赖而不安装。指定目标目录:通过-d或--dest参数设置下载路径。确保包含依赖:默认情况下会下载依…...
DIFY 又跟新了,来到 1.3.0 版本,看正文
欢迎来到 1.3.0 版本!添加了各种巧妙的功能、修复了错误,并带来了一些新功能: 一、核心亮点: 结构化输出 1、LLM 节点新增JSON Schema编辑器,确保大语言模型能够返回符合预设格式的JSON数据。这一功能有助于提升数据…...
凸包问题 Graham 扫描算法 MATLAB
算法要解决的问题 Graham 扫描算法要解决的问题是在给定一组二维平面上的点集时,找出能够完全包含这些点的最小凸多边形,这个最小凸多边形就是这些点的凸包。在很多实际场景中,我们可能只关注一个点集的最外层边界,而凸包算法就可…...
es+kibana---集群部署
其实一般es要跑3个节点的,这样才能做高可用,处理并发大,但是我这里只是一个pod mkdir -p /stroe/data/es es搭建: #【拉取镜像】 #docker pull elasticsearch:6.8.7 #docker pull busybox:1.28 【导入镜像】 docker load -i es.…...
定时器的源码介绍与简单实现——多线程编程简单案例[多线程编程篇(5)]
目录 前言 什么是定时器 JAVA标准库中的定时器 而关于sched方法,请看源码: 为什么我们能知道"notify() 唤醒后台线程 TimerThread"? TimerThread 关键逻辑 第一步:加锁 queue,看有没有任务 第二步:取出最近要执行的任务 …...
SQL常用数据清洗语句
数据清洗:发现并纠正数据文件里的数据错误和不一致性,让数据达到分析要求的过程。 运用 SQL 进行数据清洗时,可借助多种语句和函数来处理数据中的缺失值、重复值、异常值以及格式错误等问题。 1. 处理缺失值 数据中某些变量的值为空的情况&…...
《Go 语言高并发爬虫开发:淘宝商品 API 实时采集与 ETL 数据处理管道》
在电商数据处理领域,高效获取并处理海量商品数据是企业实现精准运营、市场分析的重要基础。Go 语言凭借其出色的并发性能,成为开发高并发爬虫的理想选择。本文将介绍如何使用 Go 语言进行淘宝商品 API 实时采集,并构建 ETL(Extrac…...
大模型(LLMs)加速篇
当前优化模型最主要技术手段有哪些? 算法层面:蒸馏、量化软件层面:计算图优化、模型编译硬件层面:FP8(NVIDIA H系列GPU开始支持FP8,兼有fp16的稳定性和int8的速度) 推理加速框架有哪一些&#…...
Linux0.11引导启动程序:简略过程
引言 目标:是重写boot文件夹下面的引导文件,加入一些个人信息。语法:由于使用两个语法风格的汇编需要两个汇编器,有些麻烦,直接全都用GNU的 as(gas)进行编译。使用AT&T 语法的汇编语言程序。接下来先拜读同济大学赵…...
【JAVAFX】controller中反射调用@FXML的点击事件失败
场景 当前有一个controller中定义的事件如 FXMLvoid openZhengjieWindow(ActionEvent event) {System.out.println("zhengjie");}通过反射去调用 public void callMethodByString(String methodSuffix) {try {Method method this.getClass().getMethod("open&…...