单调栈算法精解(Java实现):从原理到高频面试题
在算法与数据结构的领域中,单调栈(Monotonic Stack)凭借其独特的设计和高效的求解能力,成为解决特定类型问题的神兵利器。它通过维护栈内元素的单调性,能将许多问题的时间复杂度从暴力解法的\(O(n²)\)优化至\(O(n)\),极大提升算法效率。本文将深入解析单调栈的核心思想、Java 实现方式,并结合 LeetCode 高频面试题,帮助读者透彻掌握这一重要算法工具。
一、单调栈核心思想
单调栈是一种特殊的数据结构,其核心在于保持栈内元素的单调性,这一特性使其在解决 “寻找下一个更大 / 更小元素” 类问题时表现卓越。它具有以下核心特性:
- 元素单调性:栈内元素始终保持严格递增或递减顺序,根据具体问题需求构建单调递增栈或单调递减栈。
- 后进先出机制:新元素入栈时,需与栈顶元素进行比较,根据单调性规则决定是否触发栈顶元素出栈。
- 时空效率优势:通过一次遍历完成操作,时间复杂度为\(O(n)\);空间复杂度为\(O(n)\),用于存储栈内元素 。
二、单调栈两种形式
根据元素单调性的不同,单调栈可分为单调递增栈和单调递减栈,二者在操作规则与应用场景上各有侧重:
类型 | 操作规则 | 典型应用场景 | 适用问题特征 |
---|---|---|---|
单调递增栈 | 新元素大于或等于栈顶元素时,栈顶元素出栈,直至满足单调性 | 寻找下一个更小元素、计算元素左侧 / 右侧第一个小于自身的元素 | 涉及局部最小值判断、区间边界查找的问题 |
单调递减栈 | 新元素小于或等于栈顶元素时,栈顶元素出栈,直至满足单调性 | 寻找下一个更大元素、计算元素左侧 / 右侧第一个大于自身的元素 | 涉及局部最大值判断、区间范围统计的问题 |
三、Java 实现模板
public class MonotonicStack {// 单调递减栈模板,用于寻找下一个更大元素public int[] nextGreaterElement(int[] nums) {int[] res = new int[nums.length];Arrays.fill(res, -1);Deque<Integer> stack = new ArrayDeque<>();for (int i = 0; i < nums.length; i++) {while (!stack.isEmpty() && nums[i] > nums[stack.peek()]) {int idx = stack.pop();res[idx] = nums[i];}stack.push(i);}return res;}
}
上述代码展示了使用 Java 实现单调递减栈的核心逻辑:
- 通过
Deque
接口创建栈,ArrayDeque
作为具体实现类,提供高效的栈操作。 - 遍历数组过程中,当新元素大于栈顶元素时,弹出栈顶元素并记录其下一个更大元素,最终栈内剩余元素的下一个更大元素为 -1。
四、经典问题解析
4.1 下一个更大元素 I(LeetCode 496)
题目要求:给定两个没有重复元素的数组 nums1
和 nums2
,其中 nums1
是 nums2
的子集。返回 nums1
中每个元素在 nums2
中的下一个比其大的值。如果不存在,对应位置输出 -1。
class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {Map<Integer, Integer> nextGreater = new HashMap<>();Deque<Integer> stack = new ArrayDeque<>();for (int num : nums2) {while (!stack.isEmpty() && num > stack.peek()) {nextGreater.put(stack.pop(), num);}stack.push(num);}int[] res = new int[nums1.length];for (int i = 0; i < nums1.length; i++) {res[i] = nextGreater.getOrDefault(nums1[i], -1);}return res;}
}
解题思路:
- 遍历
nums2
构建单调递减栈,同时使用哈希表记录每个元素的下一个更大元素。 - 遍历
nums1
,通过哈希表快速获取对应元素的下一个更大元素,若不存在则返回 -1。
4.2 每日温度(LeetCode 739)
题目要求:给定一个整数数组 temperatures
,表示每天的温度,返回一个数组 answer
,其中 answer[i]
是指对于第 i
天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
class Solution {public int[] dailyTemperatures(int[] temperatures) {int[] res = new int[temperatures.length];Deque<Integer> stack = new ArrayDeque<>();for (int i = 0; i < temperatures.length; i++) {while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {int idx = stack.pop();res[idx] = i - idx;}stack.push(i);}return res;}
}
解题思路:
- 利用单调递减栈存储温度的索引,当遇到更高温度时,计算当前温度与栈顶温度索引的差值,即为下一个更高温度的天数。
4.3 柱状图中最大矩形(LeetCode 84)
题目要求:给定 n
个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。
class Solution {public int largestRectangleArea(int[] heights) {Deque<Integer> stack = new ArrayDeque<>();int maxArea = 0;int[] newHeights = Arrays.copyOf(heights, heights.length + 1);for (int i = 0; i < newHeights.length; i++) {while (!stack.isEmpty() && newHeights[i] < newHeights[stack.peek()]) {int h = newHeights[stack.pop()];int w = stack.isEmpty() ? i : i - stack.peek() - 1;maxArea = Math.max(maxArea, h * w);}stack.push(i);}return maxArea;}
}
解题思路:
- 在原始高度数组末尾添加一个 0,作为哨兵节点,确保所有元素都能被处理。
- 利用单调递增栈,计算每个高度对应的矩形宽度,从而得出最大矩形面积。
五、算法核心技巧
5.1 处理循环数组
// 循环数组解法(LeetCode 503)
public int[] nextGreaterElements(int[] nums) {int n = nums.length;int[] res = new int[n];Arrays.fill(res, -1);Deque<Integer> stack = new ArrayDeque<>();for (int i = 0; i < 2 * n; i++) {int num = nums[i % n];while (!stack.isEmpty() && num > nums[stack.peek()]) {res[stack.pop()] = num;}if (i < n) stack.push(i);}return res;
}
技巧:通过将循环数组视为两倍长度的数组进行遍历,模拟循环效果,解决循环数组中寻找下一个更大元素的问题。
5.2 二维矩阵问题
// 最大矩形(LeetCode 85)
public int maximalRectangle(char[][] matrix) {if (matrix.length == 0) return 0;int[] heights = new int[matrix[0].length];int maxArea = 0;for (char[] row : matrix) {for (int j = 0; j < row.length; j++) {heights[j] = row[j] == '1' ? heights[j] + 1 : 0;}maxArea = Math.max(maxArea, largestRectangleArea(heights));}return maxArea;
}
技巧:将二维矩阵逐行转化为柱状图,通过复用柱状图中最大矩形的求解方法,解决二维矩阵中的最大矩形问题。
六、复杂度分析
问题类型 | 时间复杂度 | 空间复杂度 | 核心操作说明 |
---|---|---|---|
一维数组 | \(O(n)\) | \(O(n)\) | 对数组进行单次遍历,栈操作复杂度与遍历次数相关 |
二维矩阵 | \(O(mn)\) | \(O(n)\) | 逐行处理矩阵,每行调用一维数组解法,m 为行数,n 为列数 |
循环数组 | \(O(n)\) | \(O(n)\) | 虚拟扩展数组长度为两倍,本质仍为单次遍历操作 |
七、常见错误与调试技巧
7.1 常见错误:
- 索引混淆:在栈中存储元素值还是元素索引不明确,导致后续计算错误。
- 边界处理:未正确处理栈为空的情况,或在数组边界处的操作逻辑错误。
- 相等处理:未明确元素相等时的出栈逻辑,影响单调性维护。
- 循环条件:遍历数组或处理栈操作时,循环方向判断错误,导致结果偏差。
7.2 调试方法:
- 打印栈状态:在关键操作处添加打印语句,跟踪栈内元素变化,定位逻辑错误。
- 小测试用例:使用简单、边界情况的测试用例,逐步验证算法正确性。
- 可视化辅助:通过画图、表格等方式,直观呈现栈的变化过程,辅助理解和调试。
- 暴力对比:将单调栈解法与暴力解法的结果进行对比,验证算法的准确性。
八、高频面试题扩展
- 接雨水(LeetCode 42):利用单调栈计算柱状图中能接住的雨水量。
- 子数组最小值之和(LeetCode 907):通过单调栈统计所有子数组中最小值的总和。
- 滑动窗口最大值(LeetCode 239):结合单调队列(单调栈的扩展应用)实现高效求解。
- 移掉 K 位数字(LeetCode 402):使用单调栈构造最小数字。
- 132 模式(LeetCode 456):通过单调栈判断数组中是否存在 132 模式的子序列。
// 接雨水解法示例
class Solution {public int trap(int[] height) {Deque<Integer> stack = new ArrayDeque<>();int total = 0;for (int i = 0; i < height.length; i++) {while (!stack.isEmpty() && height[i] > height[stack.peek()]) {int bottom = stack.pop();if (stack.isEmpty()) break;int left = stack.peek();int w = i - left - 1;int h = Math.min(height[left], height[i]) - height[bottom];total += w * h;}stack.push(i);}return total;}
}
九、性能优化策略
- 数组替代栈:使用
int[]
数组和指针模拟栈操作,减少对象创建开销,提升性能。 - 预处理高度:提前计算元素左侧 / 右侧第一个更大 / 更小元素的索引,避免重复计算。
- 剪枝优化:在遍历过程中,根据已知条件提前终止不必要的计算,减少运算量。
- 空间复用:复用结果数组或中间计算数组,减少内存分配与回收的开销。
十、学习路径建议
- 基础阶段:熟练掌握单调栈模板代码,通过经典题目理解其核心逻辑与应用场景。
- 进阶阶段:挑战二维矩阵、循环数组等扩展问题,提升问题转化与综合运用能力。
- 高手阶段:研究竞赛级优化方案,探索单调栈与其他数据结构、算法的结合应用。
- 面试准备:针对性练习高频面试题及其变种,总结解题思路与技巧,提升面试应变能力。
结语
单调栈作为算法领域中高效解决特定问题的工具,其核心思想与实现方式值得深入钻研。理解其如何通过维护单调性优化时间复杂度,是掌握这一算法的关键。在学习过程中,建议读者多画图辅助理解栈的变化过程,尝试将已有解法迁移到新问题中,并通过大量练习巩固知识。
推荐练习顺序: 496 → 739 → 503 → 42 → 84 → 85 → 907 → 239 → 402 → 456
本文所有 Java 代码均通过 LeetCode 平台测试,可直接用于面试准备与算法学习。欢迎在评论区分享你的学习心得、解题思路,或提出疑问,让我们共同探讨单调栈算法的魅力!
相关文章:
单调栈算法精解(Java实现):从原理到高频面试题
在算法与数据结构的领域中,单调栈(Monotonic Stack)凭借其独特的设计和高效的求解能力,成为解决特定类型问题的神兵利器。它通过维护栈内元素的单调性,能将许多问题的时间复杂度从暴力解法的\(O(n)\)优化至\(O(n)\)&am…...
密码工具类-生成随机密码校验密码强度是否满足要求
生成随机密码 符合密码强度的密码要求: 至少有一个大写字母至少有一个小写字母至少有一个数字至少有一个特殊字符长度满足要求(通常为8-16位) // 大写字母private static final String UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ";…...
什么是进程,如何管理进程
基本概念(什么是进程?) 课本概念:程序的一个执行实例,正在执行的程序等内核观点:担当分配系统资源(CPU时间,内存)的实体。 描述进程-PCB 进程信息被放在一个叫做进程控…...
小刚说C语言刷题—1044 -找出最经济型的包装箱型号
1.题目描述 已知有 A,B,C,D,E五种包装箱,为了不浪费材料,小于 10公斤的用 A型,大于等于 10公斤小于 20 公斤的用 B型,大于等于 20公斤小于 40 公斤的用 C型,大于等于 40…...
用 GRPO 魔法点亮Text2SQL 的推理之路:让模型“思考”得更像人类
推理能力(Chain of Thought, CoT)可以帮助模型逐步解释其思考过程,从而提高Text-to-SQL 生成的准确性和可解释性。本文探讨了如何将一个标准的 7B 参数的大型语言模型(Qwen2.5-Coder-7B-Instruct)转变为一个能够为Text…...
k8s service的类型
service和Pods service通过使用labels指向pods,而不是指向deployments或者replicasets。这种设计的灵活性极高,因为创建pods的方式有很多,而Service不需要关心pods通过那种方式创建 不使用service(首先看不使用service的情况) 如下…...
机器学习 day6 -线性回归练习
题目: 从Kaggle的“House Prices - Advanced Regression Techniques”数据集使用Pandas读取数据,并查看数据的基本信息。选择一些你认为对房屋价格有重要影响的特征,并进行数据预处理(如缺失值处理、异常值处理等)。…...
机器学习-简要与数据集加载
一.机器学习简要 1.1 概念 机器学习即计算机在数据中总结规律并预测未来结果,这一过程仿照人类的学习过程进行。 深度学习是机器学习中的重要算法的其中之一,是一种偏近现代的算法。 1.2 机器学习发展历史 从上世纪50年代的图灵测试提出、塞缪尔开发…...
HTTP请求与前端资源未优化的系统性风险与高性能优化方案
目录 前言一、未合并静态资源:HTTP请求的隐形杀手1.1 多文件拆分的代价1.2 合并策略与工具链实践 二、未启用GZIP压缩:传输流量的浪费2.1 文本资源的压缩潜力2.2 服务端配置与压缩算法选择 三、未配置浏览器缓存:重复请求的根源3.1 缓存失效的…...
黑马点评day04(分布式锁-setnx)
4、分布式锁 4.1 、基本原理和实现方式对比 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程并行&#x…...
哈尔滨服务器租用
选择一家正规的本地服务商,能够直接促进您网站今后的发展、确保您企业的信息化进程安全、高效。擦亮您的慧眼,用我的经验告诉您该怎么选择服务商。。。。。。。。综合我们为数据客户服务的经验,选择服务器租用、服务提供商客户所需要关注的主…...
企业级RAG架构设计:从FAISS索引到HyDE优化的全链路拆解,金融/医疗领域RAG落地案例与避坑指南(附架构图)
本文较长,纯干货,建议点赞收藏,以免遗失。更多AI大模型应用开发学习内容,尽在聚客AI学院。 一. RAG技术概述 1.1 什么是RAG? RAG(Retrieval-Augmented Generation,检索增强生成) 是…...
js获取uniapp获取webview内容高度
js获取uniapp获取webview内容高度 在uni-app中,如果你想要获取webview的内容高度,可以使用uni-app提供的bindload事件来监听webview的加载,然后通过调用webview的invokeMethod方法来获取内容的高度。 以下是一个示例代码: <te…...
AI量化解析:从暴跌5%到飙涨3%—非线性动力学模型重构黄金极端波动预测框架
AI分析:假期效应褪去,金价回调背后的市场逻辑 五一假期期间,全球贵金属市场经历显著波动。5月1日,现货黄金单日跌幅达5.06%,价格从历史高位回落至3200美元/盎司附近,国内金饰价格同步回调,主流…...
Python之pip图形化(GUI界面)辅助管理工具
Python之pip图形化(GUI界面)辅助管理工具 pip 是 Python 的包管理工具,用于安装、管理、更新和卸载 Python 包(模块)。用于第三方库的安装和管理过程,是 Python 开发中不可或缺的工具。 包的安装、更新、…...
数字传播生态中开源链动模式与智能技术协同驱动的品牌认知重构研究——基于“开源链动2+1模式+AI智能名片+S2B2C商城小程序”的场景化传播实践
摘要:在数字传播碎片化与用户注意力稀缺的双重挑战下,传统品牌认知构建模式面临效率衰减与情感黏性缺失的困境。本文以“开源链动21模式AI智能名片S2B2C商城小程序”的协同创新为切入点,构建“技术赋能-场景重构-认知强化”的分析框架。通过对…...
小芯片大战略:Chiplet技术如何重构全球半导体竞争格局?
在科技飞速发展的今天,半导体行业作为信息技术的核心领域之一,其发展速度和创新水平对全球经济的发展具有举足轻重的影响。然而,随着芯片制造工艺的不断进步,传统的单片集成方式逐渐遇到了技术瓶颈,如摩尔定律逐渐逼近…...
链表的面试题3找出中间节点
来来来,接着继续我们的第三道题 。 解法 暴力求解 快慢指针 https://leetcode.cn/problems/middle-of-the-linked-list/submissions/ 这道题的话,思路是非常明确的,就是让你找出我们这个所谓的中间节点并且输出。 那这道题我们就需要注意…...
Java泛型深度解析与电商场景应用
学海无涯,志当存远。燃心砺志,奋进不辍。 愿诸君得此鸡汤,如沐春风,事业有成。 若觉此言甚善,烦请赐赞一枚,共励学途,同铸辉煌! 泛型的工作原理可能包括类型擦除、参数化类型、类型边…...
C语言 指针(7)
目录 1.函数指针变量 2.函数指针数组 3.转移表 1.函数指针变量 1.1函数指针变量的创建 什么是函数指针变量呢? 根据前面学习整型指针,数组指针的时候,我们的类比关系,我们不难得出结论: 函数指针变量应该是用来…...
go 编译报错:build constraints exclude all Go files
报错信息: package command-line-arguments imports github.com/amikos-tech/chroma-go imports github.com/amikos-tech/chroma-go/pkg/embeddings/default_ef imports github.com/amikos-tech/chroma-go/pkg/tokenizers/libtokenizers: …...
Android Service 从 1.0 到 16 的演进史
一、Android 1.0(API 1) - 服务的诞生 核心特性: 基础服务组件:作为四大组件之一,Service 用于在后台执行长时间运行的任务,不提供 UI 界面。 启动方式:通过 startService() 启动独立运行的服…...
如何保障服务器租用中的数据安全?
网络科技和互联网的飞速发展,让用户越来越依赖与网络业务,各个行业开展了不同的线上服务,租用服务器已经成为必不可少的组成部分,能够为企业带来便捷,但是数据安全也是不可忽视的,为了能够保护服务器中数据…...
python校园二手交易管理系统-闲置物品交易系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
消除AttributeError: module ‘ttsfrd‘ has no attribute ‘TtsFrontendEngine‘报错输出的记录
#工作记录 尝试消除 消除“模块ttsfrd没有属性ttsfrontendengine”的错误的记录 报错摘录: Traceback (most recent call last): File "F:\PythonProjects\CosyVoice\webui.py", line 188, in <module> cosyvoice CosyVoice(args.model_di…...
MD2card + Deepseek 王炸组合 一键制作小红书知识卡片
本文目录 MD2Card介绍使用示例deepseek 提示词输出结果MD2Card 制作小红书卡片 MD2Card介绍 MD2Card 是一个免费的 Markdown 转知识卡片工具,支持一键生成小红书风格海报、社交媒体文案排版,让创作者轻松制作精美的图文内容。支持多种主题风格、长文自动…...
Relay算子注册(在pytorch.py端调用)
1. Relay算子注册 (C层) (a) 算子属性注册 路径: src/relay/op/nn/nn.cc RELAY_REGISTER_OP("hardswish").set_num_inputs(1).add_argument("data", "Tensor", "Input tensor.").set_support_level(3).add_type_rel("Identity…...
基于RT-Thread的STM32F4开发第二讲第一篇——ADC
文章目录 前言一、RT-Thread工程创建二、ADC工程创建三、ADC功能实现1.ADC.c2.ADC.h3.mian.c 四、效果展示和工程分享总结 前言 ADC是什么不多讲了,前面裸机操作部分有很多讲述。我要说的是RT-Thread对STM32的ADC外设的适配极其不好,特别是STM32G4系类&…...
py实现win自动化自动登陆qq
系列文章目录 py实现win自动化自动登陆qq 文章目录 系列文章目录前言一、上代码?总结 前言 之前都是网页自动化感觉太容易了,就来尝尝win自动化,就先写了一个qq登陆的,这个是拿到className 然后进行点击等。 一、上代码…...
Axure : 列表分页、 列表翻页
文章目录 引言I 列表分页操作说明II 列表翻页操作说明引言 列表分页实现思路:局部变量、 中继器设置每页项目数 I 列表分页 操作说明 在列表元件底部添加一个分页下拉控件,分别为10,20,30,40,50; 将列表转换为动态面板,将设置面板大小勾选取消 给分页大小下拉控件添加…...
大学之大:隆德大学2025.5.6
隆德大学:北欧学术明珠的八百年传承与创新 一.前身历史:从中世纪神学院到现代综合大学的蜕变 隆德大学的历史可追溯至1425年,由丹麦国王埃里克七世在瑞典南部城市隆德创立的“神学与教会法研究院”。这所中世纪学府最初以培养天主教神职人员…...
每日算法-250506
每日算法学习记录 - 250506 今天记录了三道算法题的解题过程和思路,分享给大家。 3192. 使二进制数组全部等于 1 的最少操作次数 II 题目 思路 贪心 解题过程 我们从左到右遍历数组。使用一个变量 ret 来记录已经执行的操作次数。 对于当前元素 nums[i]&#x…...
【免费试用】LattePanda Mu x86 计算模块套件,专为嵌入式开发、边缘计算与 AI 模型部署设计
本次活动为载板设计挑战,旨在激发创意与技术实践能力,鼓励电子工程师、创客、学生及开发者围绕指定LattePanda Mu进行功能丰富、应用多样的载板开发设计。参赛用户将有机会展示硬件设计能力,并通过作品解决实际问题或构建创新项目。本次挑战活…...
用于备份的git版本管理指令
一、先下载一个git服务器软件并安装,创建一个git服务器进行备份的版本管理。 下列指令用于git常用备份: 1、强制覆盖远程仓库: git push --force origin master 2、重新指向新仓库: git remote set-url origin http://192.168.1.2…...
STM32H743单片机实现ADC+DMA多通道检测
在stm32cubeMX上配置ADCDMA实现多通道检测功能 DMA配置 生成代码,HAL_ADC_Start_DMA开始DMA读取ADC值,HAL_ADC_Stop_DMA关闭DMA读取 void Start_ADC2_DMA(void) {/* 初始化后校准ADC */HAL_ADCEx_Calibration_Start(&hadc2, ADC_CALIB_OFFSET, ADC_…...
(提升)媒体投稿技能
1\前期策划与准备 精准定位目标受众,分析内容偏好与活跃媒体基于目标受众,确定发稿核心主题与内容方向 2\内容创作与素材 撰写稿件注重标题吸引力,确保内容逻辑清晰价值突出。素材整合准备高质量的配图、视频 3\内部审核与优化 对稿件内…...
2025年提交App到Appstore从审核被拒到通过的经历
今年3月份提交一个App到Appstore,感觉比以前要严格了很多,被拒了多次才通过。 如果周末提交审核会非常非常,所以最好选择周一之周四的中午提交。 第一次提交被拒,原因为 Guideline 2.1 - Performance - App Completeness Guidel…...
63.微服务保姆教程 (六) SkyWalking--分布式链路追踪系统/分布式的应用性能管理工具
SkyWalking—分布式链路追踪系统/分布式的应用性能管理工具(APM) 一、为什么要用SkyWalking 对于一个有很多个微服务组成的微服务架构系统,通常会遇到一些问题,比如: 如何串联整个调用链路,快速定位问题如何缕清各个微服务之间的依赖关系如何进行各个微服务接口的性能分…...
vue3 computed方法传参数
我们对computed的基础用法不陌生,比如前端项目中经常会遇到数据处理的情况,我们就会选择computed方法来实现。但大家在碰到某些特殊场景,比如在template模板中for循环遍历时想给自己的计算属性传参,这个该怎么实现呢,很…...
Linux中为某个进程临时指定tmp目录
起因: 在linux下编译k8s,由于编译的中间文件太多而系统的/tmp分区设置太小,导致编译失败,但自己不想或不能更改/tmp分区大小,所以只能通过其他方式解决。 现象: tmp分区大小: 解决方法&#x…...
Informer源码解析4——完整注意力机制解读
完整注意力机制 源码 class FullAttention(nn.Module):def __init__(self, mask_flagTrue, factor5, scaleNone, attention_dropout0.1, output_attentionFalse):"""实现完整的注意力机制,支持因果掩码和注意力权重输出。Args:mask_flag (bool): 是…...
第一节:Web3开发概述
一、什么是Web3? 如果把互联网比作一个「大超市」: Web1(1990年代):你只能看货架上的商品(比如新浪、搜狐这种只读网站)。Web2(现在):你不仅能看࿰…...
【愚公系列】《Manus极简入门》022-艺术创作顾问:“艺术灵感使者”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
k8s node 内存碎片化如何优化?
在 Kubernetes 集群中,内存碎片化(Memory Fragmentation)会导致系统无法分配连续的内存块,即使总内存充足,也可能触发 OOM(Out of Memory)或影响性能。以下是针对 k8s Node 内存碎片化的优化策略…...
当K8S容器没有bash时7种高阶排查手段
遇到容器没有bash甚至没有sh的情况,就像被困在没有门窗的房间。但真正的K8S运维高手,即使面对这种情况也能游刃有余。以下是我们在生产环境锤炼出的7大实战技巧: 一、基础三板斧(新手必学) 1. 日志捕获术——穿透重启…...
linux -c程序开发
目的是在linux中创建可执行的c语言程序的步骤 和gcc,make和git的简单运用 建立可执行程序的步骤: -1:预处理: --:头文件展开;--去掉注释;--宏替换;--条件编译 -2:编译 --:将预处理之后的c语言替换为汇编语言带阿米 --:语法分析,语义分析,代码生成 --:检查语法正确性并且优…...
LLM损失函数面试会问到的
介绍一下KL散度 KL(Kullback-Leibler散度衡量了两个概率分布之间的差异。其公式为: D K L ( P / / Q ) − ∑ x ∈ X P ( x ) log 1 P ( x ) ∑ x ∈ X P ( x ) log 1 Q ( x ) D_{KL}(P//Q)-\sum_{x\in X}P(x)\log\frac{1}{P(x)}\sum_{x\in X}…...
【redis】redis 手动切换主从
场景一: 测试需要,需要手动切换主从 在redis节点: $ redis-cli -h xx.xx.xx.xx -p XX -a XX shutdown 不要直接关闭redis进程,使用 shutdown ,能在进程关闭前持久化内存中的数据 待主从切换完毕后࿱…...
Webug4.0靶场通关笔记17- 第21关文件上传(htaccess)
目录 第21关 文件上传(htaccess) 1.打开靶场 2.源码分析 (1)右键源码 (2)源码分析 3.渗透实战 (1)配置环境 (2)构造脚本 (3)访问脚本 本文通过《webu…...
ASP.NET Core 中间件
文章目录 前言一、中间件的本质定义:类比: 二、作用场景:三、中间件的执行顺序四、中间件的配置方式1)委托形式(最常见):2)类形式: 五、核心方法六、注意事项七、中间件 …...