每日算法-250411
这是我今天的 LeetCode 刷题记录和心得,主要涉及了二分查找的应用。
3143. 正方形中的最多点数
题目简述:
思路
本题的核心思路是 二分查找。
解题过程
为什么可以二分?
我们可以对正方形的半边长 len
进行二分。当正方形的半边长 len
越大时,可能包含的点越多,但也越有可能包含具有相同标签的点。反之,len
越小,包含的点越少,标签冲突的可能性也越小。包含点数的多少以及是否合法(无重复标签)相对于 len
的增长,具有一定的单调性(或者说,存在一个最大的 len
使得正方形合法),这满足二分查找的条件。
二分什么?
我们需要二分查找满足条件的 最大 正方形半边长 len
。查找范围可以从 0
到所有点坐标绝对值的最大值。
如何检查(check
函数)?
check(len)
函数用于判断以半边长 len
构成的正方形是否“合法”。
合法性判断包含两步:
- 遍历所有点,检查其坐标
(x, y)
是否满足abs(x) <= len
且abs(y) <= len
。 - 对于落在正方形内的点,使用一个哈希表(或大小为 26 的数组
hash
)记录出现的标签。如果在添加一个点的标签时,发现该标签已经存在于哈希表中(即hash[s[i] - 'a'] >= 1
),则说明存在重复标签,该len
值对应的正方形不合法,check
返回false
。 - 如果遍历完所有点都没有发现重复标签,则该
len
合法,check
返回true
。
指针如何移动?
在二分查找过程中:
- 计算中间值
mid
。 - 调用
check(mid)
:- 如果
check(mid)
返回true
,说明半边长为mid
的正方形是合法的。这表示我们可能可以找到一个更大的合法正方形,因此我们尝试增大边长,将搜索范围的左边界更新为left = mid + 1
。同时,因为这是一个合法的len
,我们需要记录下此时正方形内的点数(可以在check
函数内部完成,或者在check
返回true
时更新全局变量ret
)。 - 如果
check(mid)
返回false
,说明半边长为mid
的正方形不合法(有标签冲突),意味着当前的len
太大了,我们需要缩短边长,将搜索范围的右边界更新为right = mid - 1
。
- 如果
最终结果:
二分查找结束后,变量 ret
中存储的就是满足条件的最大合法正方形所包含的点数。
复杂度
- 时间复杂度: O ( N log M ) O(N \log M) O(NlogM),其中 N N N 是点的数量, M M M 是坐标的最大绝对值(二分查找的上界)。
check
函数需要 O ( N ) O(N) O(N) 时间,二分查找进行 log M \log M logM 次。 - 空间复杂度: O ( C ) O(C) O(C) 或 O ( N ) O(N) O(N)。 O ( C ) O(C) O(C) 是指存储标签计数的哈希表/数组所需空间( C = 26 C=26 C=26)。如果考虑最坏情况下所有点标签不同且都在某个正方形内,可能认为是 O ( N ) O(N) O(N),但通常关注辅助空间,所以 O ( C ) O(C) O(C) 更精确描述
check
函数的额外空间。
Code
class Solution {private int ret;public int maxPointsInsideSquare(int[][] points, String ss) {char[] s = ss.toCharArray();int left = 0;int right = 0;for (int[] point : points) {right = Math.max(right, Math.max(Math.abs(point[0]), Math.abs(point[1])));}while (left <= right) {int mid = left + (right - left) / 2;if (check(points, s, mid)) {left = mid + 1;} else {right = mid - 1;}}return ret;}private boolean check(int[][] points, char[] s, int len) {int[] hash = new int[26];int tmp = 0; // 合法正方形里点的个数// 1.是不是合法的for (int i = 0; i < points.length; i++) {if (Math.abs(points[i][0]) <= len && Math.abs(points[i][1]) <= len) {if (hash[s[i] - 'a'] >= 1) {// 标签已经存在return false;}hash[s[i] - 'a']++;tmp++;}}// 2.更新数目ret = tmp;return true;}
}
69. x 的平方根
题目简述:
思路
采用 二分查找。
解题过程
为什么可以二分?
我们要找的是一个整数 ans
,使得 ans * ans <= x
并且 (ans + 1) * (ans + 1) > x
。考虑函数 f(y) = y * y
,这是一个在非负整数域上的单调递增函数。我们需要找到满足 y*y <= x
的最大整数 y
。这种在单调序列(或具有单调性质的函数)上查找满足特定条件的边界值的问题,非常适合使用二分查找。
二分什么?
二分查找的目标值,即可能的平方根 mid
。查找范围是 [0, x]
(或者可以优化为 [0, x/2 + 1]
或像代码中的 [1, x/2]
,需要处理 x=0, 1
的边界情况,原代码 right = x/2
对于 x=0, 1
需要注意,但最终逻辑能处理)。
指针如何移动?
在二分查找 [left, right]
区间内:
- 计算中间值
mid
。为了防止mid * mid
溢出int
,使用long
类型进行计算和比较。 - 比较
(long)mid * mid
与x
:- 如果
mid * mid < x
:说明mid
太小了,它可能是平方根的一部分,但我们应该尝试更大的值。真正的整数平方根应该在mid
的右侧(或就是mid
本身)。所以,更新搜索区间的左边界left = mid + 1
。 - 如果
mid * mid >= x
:说明mid
可能等于x
的平方根,或者比它大。我们需要尝试更小的值(或者mid
就是边界)。所以,更新搜索区间的右边界right = mid - 1
。
- 如果
返回什么?
循环终止条件是 left > right
。根据二分查找的实现方式,最终 left
指针将指向第一个满足 mid * mid > x
的 mid
(或者说,left
是满足 (left-1)*(left-1) <= x
的最小 left
)。
分析代码中的返回逻辑 return left * left == x ? left : left - 1;
:
- 循环结束后,
left
的值是第一个使得mid*mid >= x
评估为true
时的mid
值加 1(或者是mid
本身,如果mid*mid == x
且之后right
被设为mid-1
导致循环结束)。 - 如果
left * left == x
,说明left
正好是x
的精确整数平方根,直接返回left
。 - 如果
left * left != x
(根据循环条件,此时必然是left * left > x
),这意味着left
已经超过了目标平方根,而left - 1
是最后一个满足(left - 1) * (left - 1) <= x
的整数。因此,返回left - 1
作为x
的平方根的整数部分。
复杂度
- 时间复杂度: O ( log x ) O(\log x) O(logx),二分查找的范围是
x
(或x/2
),每次迭代区间减半。 - 空间复杂度: O ( 1 ) O(1) O(1),只需要常数级别的额外空间。
Code
class Solution {public int mySqrt(int x) {int left = 1, right = x / 2;while (left <= right) {long mid = left + (right - left) / 2;if (mid * mid < x) {left = (int)mid + 1;} else {right = (int)mid - 1;}}return left * left == x ? left : left - 1;}
}
2300. 咒语和药水的成功对数(复习)
题目简述:
这是第二次写这道题,已经可以说是完全掌握了,就不再多说了,详细题解请看 每日算法-250407。
核心思路回顾:
为了高效计算每个 spell
能成功组合的 potion
数量,我们可以:
- 对
potions
数组进行 排序。 - 对于每个
spell = spells[i]
,我们需要找到potions
中满足spell * potion >= success
的药水数量。由于potions
已排序,spell * potion
的值也相对于potion
是单调递增的(因为spell > 0
)。 - 因此,我们可以使用 二分查找 在排序后的
potions
数组中找到 第一个 满足potion >= success / spell
(注意整数除法和精度问题,最好是比较乘积(long)spell * potions[mid] >= success
)的药水的索引idx
。 - 所有从
idx
到数组末尾m-1
的药水都将满足条件。所以,对于spells[i]
,成功的组合数量是m - idx
。
代码 (复习)
class Solution {public int[] successfulPairs(int[] spells, int[] potions, long success) {Arrays.sort(potions);int n = spells.length, m = potions.length;for (int i = 0; i < spells.length; i++) {spells[i] = m - check(potions, spells[i], success);}return spells;}private int check(int[] arr, int spell, long k) {int left = 0, right = arr.length - 1;while (left <= right) {int mid = left + (right - left) / 2;long x = (long)arr[mid] * (long)spell;if (x < k) {left = mid + 1;} else {right = mid - 1;}}return left;}
}
以上就是今天的刷题总结,主要是对二分查找在不同场景下的应用。继续努力!
相关文章:
每日算法-250411
这是我今天的 LeetCode 刷题记录和心得,主要涉及了二分查找的应用。 3143. 正方形中的最多点数 题目简述: 思路 本题的核心思路是 二分查找。 解题过程 为什么可以二分? 我们可以对正方形的半边长 len 进行二分。当正方形的半边长 len 越大时&…...
虚幻基础:碰撞帧运算
能帮到你的话,就给个赞吧 😘 文章目录 碰撞碰撞盒线段检测 帧运算:每个程序流就是一帧的计算结果速度过快时(10000),导致每帧移动过大(83),从而导致碰撞盒错过而没有碰撞速度快的碰撞要用线段检测 碰撞 碰撞盒 线段检…...
AI反检测如何在TikTok养号中发挥关键作用?
在 TikTok 这个全球性的短视频平台上,账号的养成和管理成为了创作者和品牌不可忽视的一环。随着平台对内容和账号行为的监管越来越严格,传统的养号方法已经难以适应新的挑战。在这一背景下,AI 反检测技术应运而生,它通过模拟人类行…...
鸿蒙案例---生肖抽卡
案例源码: Zodiac_cards: 鸿蒙生肖抽奖卡片 效果演示 初始布局 1. Badge 角标组件 此处为语雀内容卡片,点击链接查看:https://www.yuque.com/kevin-nzthp/lvl039/rccg0o4pkp3v6nua 2. Grid 布局 // 定义接口 interface ImageCount {url:…...
【AI编程技术爆发:从辅助工具到生产力革命】
目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现运行结果验证 三、性能对比测试方法论量化数据对比(2023年数据)结果分析 四、最…...
【前后端】npm包mysql2的使用__nodejs mysql包升级版
不定期更新,建议关注收藏点赞。 目录 简介使用说明 还在用mysql包吗?已经过时啦! 简介 mysql2 是一个用于 Node.js 的 MySQL 数据库驱动,它是 mysql 包的升级版,性能更好,支持 Promise 和 async/await&…...
基于LangChain的Native RAG简单样例
本文代码: Github 文章目录 1. 概述2. Native RAG 概述3. 实战:基于LangChain实现简单的Native RAG概述环境配置文档分割定义Embedding模型构建向量数据库与LLM交互 参考文献 1. 概述 众所周知, 大模型可以回答它知道的内容。但如果用户问的是它不知道…...
数据结构基础(2)
1.什么是算法? 算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 算法定义中,提到了指令,指令能被人或机器等计算装置执行。它可以是计算机指令&a…...
慢查询解决思路
1. 复现问题 慢查询的出现是常态还是偶尔?是否在业务允许范围内? "不要过早优化,先 Make it work / right,再 Make it fast。" 建议先将查询语句及其触发条件记录下来,便于后续测试、分析和对比。 2. 定位问题 2.1 单机数据库: explain查询执行计划 数据库默…...
前端下载文件时浏览器右上角没有保存弹窗及显示进度,下载完之后才会显示保存弹窗的问题定位及解决方案
需求背景 在开发过程中会发现,有的时候下载后端返回的文件,浏览器右上角不会进行保存弹窗的弹出及下载进度,而是接口响应后文件下载完才会弹出保存并且没有进度条效果,这就导致在点击下载后用户是不知道文件下载到什么进度了&…...
Streamlit在测试领域中的应用:构建自动化测试报告生成器
引言 Streamlit 在开发大模型AI测试工具方面具有显著的重要性,尤其是在简化开发流程、增强交互性以及促进快速迭代等方面。以下是几个关键点,说明了 Streamlit 对于构建大模型AI测试工具的重要性: 1. 快速原型设计和迭代 对于大模型AI测试…...
IP组播技术与internet
1.MAC地址分为三类:广播地址;组播地址;单播地址 2.由一个源向一组主机发送信息的传输方式称为组播。 3.组播MAC地址,第一个字节的最后一位为1; 单播MAC地址,第一个字节的最后一位为0; 4.不能…...
[Java基础]StringBuilder解析
StringBuilder简单总结与源码预览。 之前写StringBuilder对象默认简写为sb,被说是骂人不让用了,现在写成strBuilder了。大家一般写什么呢 StringBuilder预留空间设计 已知Redis的String结构是通过预留空间的形式来避免频繁地分配空间。 那么Java中有没有…...
国内智能外呼系统市场概况及技术发展趋势
根据最新行业报告和用户评价,国内智能外呼系统市场呈现快速增长态势,预计2025年市场规模将达到180亿元人民币,年复合增长率约20%。主要驱动因素包括AI技术成熟、企业降本增效需求以及政策扶持(如工信部《智能语音产业发展行动计划…...
小推桌面-一款全新的第三方电视桌面-全网通桌面
你是否渴望更高效、便捷地使用机顶盒桌面?小推桌面、乐看家桌面是绝佳之选!它们的界面简洁,操作轻松上手,能快速找到所需应用,大大节省时间。 小推桌面支持个性化定制,可按个人喜好调整布局、添加组件&…...
SQL实战篇,数据库在Kooboo中的实际应用(一)
本文将结合实际操作与代码示例,展示SQL 在 Kooboo 中的实际应用 仅需两步:动态创建表 基础查询,无需复杂配置,快速上手! 一、动态创建表:插入数据 Kooboo 支持多种数据库,以 SQLite 为例&…...
Matlab 调制信号和fft变换
1、内容简介 Matlab 194-调制信号和fft变换 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
2025年的Android NDK 快速开发入门
十年前写过一篇介绍NDK开发的文章《Android实战技巧之二十三:Android Studio的NDK开发》,今天看来已经发生了很多变化,NDK开发变得更加容易了。下面就写一篇当下NDK开发快速入门。 **原生开发套件 (NDK) **是一套工具,使开发者能…...
opensuse Tumbleweed虚拟机上安装
值得一提的是cpu需要给多一点核,不然压力都集中在一个点上温度会比较高,然后就是可能无法正常运行这个安装界面。 前面好像是半自动的,一直到这里选择桌面界面需要手动选择 这边必然选大蜥蜴的kde,那个蜥蜴菜单还是很好看的。 …...
AI避坑:AI生成的文件格式不一定对
今天就碰到了原来正确的文件,AI生成后文件变味UTF-8 BOM文件 导致MAUI解析出错An error occured while parsing Xaml: 根级别上的数据无效。 第 1 行,位置 1 解决方案: 将文件用文本编辑器打开,另存为UTF-8格式文件...
蓝桥杯真题-危险系数DF
抗日战争时期,冀中平原的地道战曾发挥重要作用。 地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。 我们来定义一个危险系数DF(x,y): 对于两个站点x和…...
四、TorchRec的推理优化
四、TorchRec的推理优化 文章目录 四、TorchRec的推理优化前言一、TorchRec 推理优化的两个主要区别是二、TorchRec 提供了以下内容,以将 TorchRec 模型转换为可用于推理的模型总结 前言 推理环境与训练环境不同,它们对性能和模型大小非常敏感。 一、To…...
Linux 系统中从源码编译安装软件
以下是 Linux 系统中 从源码编译安装软件 的详细步骤和注意事项,帮助你掌握这一高级操作技能: 一、编译安装的核心流程 1. 下载源码包(通常为 .tar.gz/.tar.bz2/.tar.xz) 2. 解压源码包 3. 进入源码目录 4. 配置编译参数…...
【AI论文】OLMoTrace:将语言模型输出追溯到万亿个训练标记
摘要:我们提出了OLMoTrace,这是第一个将语言模型的输出实时追溯到其完整的、数万亿标记的训练数据的系统。 OLMoTrace在语言模型输出段和训练文本语料库中的文档之间找到并显示逐字匹配。 我们的系统由扩展版本的infini-gram(Liu等人…...
BeautifulSoup 踩坑笔记:SVG 显示异常的真正原因
“这图是不是糊了?”以为是样式缺了?试试手动复制差异在哪?想用对比工具一探究竟……简单到不能再简单的代码,有问题吗?最后的真相:viewBox vs viewbox,preserveAspectRatio vs preserveaspectr…...
ai-warp 开源的Platformatic Stackable 与 AI 服务交互
一、软件介绍 文末提供程序和源码下载学习 ai-warp 开源的Platformatic Stackable 与 AI 服务交互 二、用法 npx create-platformaticlatestSelect Application, then platformatic/ai-warp 选择 Application(应用程序 ),然后选择 platfor…...
AI比人脑更强,因为被植入思维模型【53】反熵增思维模型
giszz的理解:熵用来形容系统的混乱程度。熵增就是从有序到无序,反熵增就是从无序到有序。其实阴阳二级,世界总是在变化之中。保持清醒的头脑,认识到当前是有序还是无序的,如何改变,让事物向着自己希望的方式…...
408 计算机网络 知识点记忆(8)
前言 本文基于王道考研课程与湖科大计算机网络课程教学内容,系统梳理核心知识记忆点和框架,既为个人复习沉淀思考,亦希望能与同行者互助共进。(PS:后续将持续迭代优化细节) 往期内容 408 计算机网络 知识…...
DDR管脚违例
管脚验证,出现上述违例 上述警告是IO电平配置存在冲突,主要原因是这里配置没有显示电平特性,那么vivado工具默认是生成IP的底层的代码中自带的XDC的电平,这个就冲突了。 出现这个的主要原因还是vivado某个版本工具存在漏洞&#x…...
25年河南事业单位报名详细流程图解
1.报名时间为2025年4月11日9∶00至4月17日17∶00; 2.网上缴费:2025年4月12日9:00至4月18日17:00; 3.打印准考证:2025年5月12日9∶00至5月18日14∶30; 4.笔试时间:2025年5月18日; 5.报名方式…...
一维差分数组
2.一维差分 - 蓝桥云课 问题描述 给定一个长度为 n 的序列 a。 再给定 m 组操作,每次操作给定 3 个正整数 l, r, d,表示对 a_{l} 到 a_{r} 中的所有数增加 d。 最终输出操作结束后的序列 a。 Update: 由于评测机过快,n, m 于 20…...
Windows 录音格式为什么是 M4A?M4A 怎样转为 MP3 格式
M4A 格式凭借其高效的压缩技术和卓越的音质表现脱颖而出,成为了包括 Windows 在内的众多操作系统默认的录音格式选择。然而,尽管 M4A 格式拥有诸多优点,不同的应用场景有时需要将这些文件转换为其他格式以满足特定需求。 本文将探讨 M4A 格式…...
【KWDB 创作者计划】第一卷:基础架构篇
以下是KWDB技术白皮书第一卷:基础架构篇的完整内容展示,包含要求的三个核心章节的深度解析。我们将以技术严谨性结合可读性的方式呈现,实际交付时会进一步扩展示意图和代码示例。 目录 KWDB技术白皮书卷一:基础架构篇 1. 数…...
分享一些使用DeepSeek的实际案例
文章目录 前言职场办公领域生活领域学习教育领域商业领域技术开发领域 前言 以下是一些使用 DeepSeek 的实际案例: DeepSeek使用手册资源链接:https://pan.quark.cn/s/fa502d9eaee1 职场办公领域 行业竞品分析:刚入职的小李被领导要求一天内…...
华清远见成都中心嵌入式学习总结
一、Linux 基础入门 课程首先介绍了 Linux 系统的六大特性,包括开源、免费、可裁剪等核心优势。重点讲解了文件系统结构,强调根目录(/)作为唯一入口的树状结构。通过实操学习了 pwd、ls、cd 等基础命令,掌握了绝对路径…...
【13】数据结构之树结构篇章
目录标题 树Tree树的定义树的基本概念树的存储结构双亲表示法孩子表示法孩子兄弟表示法 二叉树二叉树与度不超过2的普通树的不同之处二叉树的基本形态二叉树的分类二叉树的性质 二叉树的顺序存储二叉树的链式存储二叉树的链式存储的结点结构树的遍历先序遍历中序遍历…...
SAP GUI 显示SAP UI5应用,并实现SSO统一登陆
想用SAP UI5 做一写界面,又不想给用户用标准的Fiori APP怎么办?我觉得可以用可配置物料标准功能的思路,在SAP GUI中显示UI5界面,而不是跳转到浏览器。 代码实现后的效果如下: 1、调用UI5应用,适用于自开发…...
Linux环境变量详解
引言 在Linux系统中,环境变量是一种非常重要的概念,它影响着系统的运行方式和应用程序的行为。无论你是Linux新手还是经验丰富的管理员,深入理解环境变量都能帮助你更高效地使用和管理Linux系统。本文将从基础概念到高级应用,全面…...
【antd + vue】Tree 树形控件:默认展开所有树节点 、点击文字可以“选中/取消选中”节点
一、defaultExpandAll 默认展开所有树节点 1、需求:默认展开所有树节点 2、问题: v-if"data.length"判断的层级不够,只判断到了物理那一层,所以只展开到那一层。 3、原因分析: 默认展开所有树节点, 如果是…...
专题三——二分查找
目录 一、二分查找 1、题目 2、解题思路 3、代码实现 4、时间复杂度 5、朴素二分法的模板总结 二、在排序数组中查找元素的第一个和最后一个位置 1、题目 2、题目解析 3、代码实现 4、 模板总结(重点) 三、x的算法平方根 1、题目 2、 题目解…...
从零实现HTTP服务器
响应: 第一部分测试代码,读取请求 Makefile binhttpserver #生成的可执行程序 ccg #编译器名称 LD_FLAGS-stdc11 -lpthread #-DDEBUG1 #链接选项 srcmain.cc$(bin):$(src)$(cc) -o $ $^ $(LD_FLAGS).PHONY:clean clean:rm -f $(bin) 1111111 main.cc…...
智能检索知识库
一、智能检索知识库作用 1. 提升信息检索效率,降低人力成本 快速获取精准答案:员工无需手动翻阅大量文档(如产品手册、合同、技术文档),直接通过自然语言提问获取答案。 减少重复性工作:HR、客服、技…...
北斗导航 | 接收机自主完好性监测(RAIM)算法学习思路总结及其算法研究:理论、实现与验证
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 接收机自主完好性监测学习思路 壹、学习思路贰、理论、实现与验证1. 引…...
无法读取库伦值文件节点解决方案
读取库伦值的目的是为了换算成电流,量化场景功耗用途 1.报错日志 /power_log/debuglogger$ adb shell dmesg | grep -Ei "avc..system_server"[ 79.942272] logd.auditd: type1400 audit(1744279324.832:7149): avc: denied { read } for comm"…...
OCR API识别对比
OCR 识别DEMO OCR识别 demo 文档由来 最开始想使用百度开源的 paddlepaddle大模型 研究了几天,发现表格识别会跨行,手写识别的也不很准确。最终还是得使用现成提供的api。。 文档说明 三个体验下来 腾讯的识别度比较高,不论是手写还是识别表…...
高速电路设计概述
1.1 低速设计和高速设计的例子 本节通过一个简单的例子,探讨高速电路设计相对于低速电路设计需要考虑哪些不同的问题。希望读者通过本例,对高速电路设计建立一个表象的认识。至于高速电路设计中各方面的设计要点,将在后续章节展开详细的讨论…...
Keil C51中32位变量赋值异常问题分析与解决
Keil C51中32位变量赋值异常问题分析与解决 问题描述 在使用Keil5对51单片机进行编程时,遇到一个32位变量赋值不正确的问题。具体代码如下: typedef unsigned long uint32;g_Flow_Time (uint32)Storage[2] << 24 | Storage[3] << 16 | S…...
python工程中的包管理(requirements.txt)
pip install -r requirements.txtpython工程通过requirements.txt来管理依赖库版本,上述命令,可以一把安装依赖库,类似java中maven的pom.xml文件。 参考 [](...
用Python修改字体字形与提取矢量数据:fontTools实战指南
字体设计与分析是NLP和视觉领域的交叉应用,而**fontTools** 是一款强大的Python库,可以让我们直接操作字体文件的底层结构。本文将通过两个实用函数,展示如何修改特定字形和提取所有字形的矢量数据,帮助开发者快速上手字体编辑与分…...
数据库守护神-WAL机制
什么是WAL机制? WAL(Write-Ahead Logging,预写日志)是一种保证数据库操作原子性和持久性的核心机制。其核心原则可概括为: 任何数据修改操作,必须在对应的日志记录持久化到磁盘之后,才能将实际…...