自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 从本质看:Vue3 为什么运用 LIS 算法

摘要: Vue3的Diff算法通过LIS(最长上升子序列)优化DOM更新性能。其核心是将LCS(最长公共子序列)问题转化为LIS问题:利用唯一Key建立新旧节点的映射关系,通过索引转换将二维比较降为一维数值比较。算法首先构建新旧序列的映射表,然后通过求解LIS确定"不动点"节点,仅对剩余节点进行DOM操作。该方案将时间复杂度从O(n²)降至O(nlogn)。需注意,稳定的唯一Key是算法正确性的前提:无Key会导致就地复用策略,Key重复则会造成映射混乱,可能引发DOM错误或性能损耗。

2026-04-07 18:34:32 443

原创 ACM训练:接雨水3.0——动态接雨水

一种高效解决动态柱状图接雨水问题的算法。通过将问题分解为三个区间处理:左侧使用前缀最大值(f)、中间使用全局最大值(M)、右侧使用后缀最大值(g)。采用两棵线段树分别维护f和g序列,利用单调性实现O(logn)时间的区间更新和查询。每次修改后,通过线段树二分快速定位关键点pL和pR,并计算三段区间贡献之和(左侧f前缀和、中间M×区间长度、右侧g后缀和),从而在O(logn)时间内完成每次查询。该算法将原本O(n)的单次查询优化到对数级别,适用于大规模动态修改场景。

2026-01-16 20:47:35 983

原创 ACM训练: 2023 ICPC 亚洲区域赛 雅加达 F (线段树,扫描线,离线)

题目给定初始全零数组和多个区间操作,要求处理多个独立询问。每个询问需在指定操作区间内选择连续子区间执行,使得目标位置元素值最大。解法是离线处理:按目标位置排序查询,扫描时用堆维护活跃操作,线段树动态维护贡献序列的最大子段和。时间复杂度为O((M+Q)log M),适用于大规模数据。

2026-01-06 19:49:16 688

原创 MySQL——最左前缀法则

最左前缀法则是MySQL联合索引的核心规则,要求查询必须从索引最左列开始且不能跳过中间列。联合索引(col1,col2,col3)在B+树中按层级排序,查询时需遵循从左到右的连续匹配逻辑:全值匹配时索引完全生效;部分匹配需保持最左连续性;跳过列或非最左开头会导致索引失效。范围查询和前缀通配符(如LIKE '张%'有效,LIKE '%张'无效)是常见断点。该规则由B+树的排序特性决定,确保高效检索。口诀总结:"带头大哥不能死,中间兄弟不能断,范围之后全完蛋"。

2026-01-02 00:21:45 444

原创 Golang并发编程——CSP模型

CSP(Communicating Sequential Processes)是Go语言的核心并发模型,主张通过通信共享内存而非传统的共享内存方式。它将并发比作流水线作业,Goroutine(协程)作为独立工作者,通过Channel(通道)传递数据,天然实现同步。这种模型避免了锁竞争和死锁问题,使逻辑更清晰、性能更优。CSP三大支柱包括轻量级Goroutine、同步Channel和消息传递机制,有效解耦并发逻辑,提升开发效率和系统性能。

2026-01-01 17:04:43 427

原创 Golang中,defer 的执行顺序是怎样的?defer 的作用是什么?

Go语言中的defer采用后进先出(LIFO)机制,主要解决资源依赖问题,确保依赖资源的正确释放顺序。defer在函数返回时执行,其执行时机在返回值赋值之后、函数真正返回之前。使用时需注意:匿名返回值不受defer修改影响,命名返回值可被修改;defer参数会立即求值;避免在循环中滥用defer以防内存问题。它常用于资源释放、锁解除等场景,即使发生panic也能保证执行,是可靠的清理机制。

2025-12-31 17:47:57 272

原创 Go 语言中数组与切片的本质区别

Go语言中数组和切片虽然相似但本质不同。数组是固定长度、连续内存的数据结构,长度属于类型的一部分,传递时会完整拷贝整个数组,性能开销大。切片则是对底层数组的描述符,包含指针、长度和容量三个字段,传递时仅拷贝描述符,性能高效且支持动态扩容。数组适用于数据规模固定的场景,切片则适合大多数需要动态扩展的业务场景。理解两者的区别有助于编写高性能Go代码。

2025-12-29 15:32:18 494

原创 Go语言的多返回值是如何实现的?

Go语言通过栈空间实现多返回值功能,突破传统语言依赖寄存器的限制。编译器采用"调用者预留、被调用者填空"策略:调用方提前在栈帧中分配返回区域,被调用函数执行时将结果拷贝到预留位置。这种设计虽比寄存器方案稍慢,但保证了跨平台一致性,支持任意数量返回值,且完美兼容defer机制。通过将复杂问题转化为内存拷贝,Go以简洁的底层模型实现了强大的语言特性。

2025-12-28 15:52:37 431

原创 数据结构: 权值线段树——线段树系列(提供模板)

权值线段树是一种处理数值频率查询的数据结构。它以值域为下标,节点存储数值出现次数,支持三大核心操作:单点修改(插入/删除)、前缀和查询(排名)和第k小查询。相比普通线段树处理位置区间,权值线段树直接处理数值本身。对于大范围数值,可通过离散化压缩值域空间。模板提供了建树、修改、查询排名和第k小数的标准实现,时间复杂度均为O(log M),其中M为值域大小。这种结构特别适合处理动态集合中的数值统计问题。

2025-12-27 17:33:24 452

原创 数据结构:基础线段树——线段树系列(提供模板)

线段树是一种二叉树形数据结构,每个节点代表一个区间(线段),并通过分治思想将大区间分解为小区间,实现高效查询与更新。

2025-12-26 17:05:31 221

原创 Gin.RouterGroup:分组、中间件与路径组合

Gin框架的路由核心是RouterGroup而非gin.Engine。RouterGroup提供路径前缀管理、中间件隔离、嵌套分组和统一方法注册等功能。通过分组机制可实现路径自动拼接(如/api/v1/users)和中间件作用域控制。支持HTTP方法路由、静态文件服务和多级分组嵌套,典型应用包括公共路由、认证路由组和管理员路由组。这种设计使Gin具备灵活的路由组织和中间件管理能力。

2025-12-25 14:57:28 392

原创 Gin 框架 JSON 全链路:从响应返回到请求绑定

Gin 框架在 Go 语言 Web 开发中通过高效 JSON 处理简化前后端交互。支持 c.JSON() 快速响应结构化数据(如 gin.H、自定义结构体或切片),并通过 ShouldBindJSON 自动解析请求体到结构体,结合 binding 标签实现字段验证(如必填、格式、范围等)。提供多种绑定方式(ShouldBind、MustBindWith),支持内容类型自动检测,确保数据安全性与一致性。示例展示了从简单响应到复杂验证的完整流程,凸显 Gin 在 API 开发中的实用性。

2025-12-24 17:14:03 821

原创 Gin路由:构建高效RESTful API

本文介绍了Gin框架中的HTTP方法路由和路径参数处理。主要内容包括:1)基础HTTP方法(GET/POST/PUT/DELETE/PATCH)的实现;2)HEAD和OPTIONS方法的特殊用途;3)路径参数获取方式,包括单个参数、多个参数和可选参数;4)特殊路由方法如Any和Handle;5)路由参数获取技巧,涵盖路径参数和查询参数。最后提供了一个完整的用户管理系统路由示例,展示了RESTful API的实现方式。文章结构清晰,代码示例丰富,适合快速掌握Gin框架的路由功能。

2025-12-23 17:17:04 227

原创 Gin 框架:*gin.Engine 主要方法

Gin框架的核心引擎*gin.Engine是整个Web应用的核心,提供路由管理、HTTP服务启动、中间件处理等关键功能。它继承自RouterGroup,支持各类HTTP方法路由注册(GET/POST等)、中间件添加和路由分组。此外还包含静态文件服务、错误处理(404/405)、模板渲染等服务启动方法(Run/RunTLS)。作为Gin应用的入口点,理解gin.Engine的结构和功能是掌握Gin开发的基础。

2025-12-22 16:31:40 442

原创 Tarjan算法图论全家桶--点双联通分量

在无向图G=(V,E)中,如果(及其关联的边)后,子图仍然连通,则称这个子图是的。:图的。

2025-12-17 17:28:27 197

原创 Tarjan算法图论全家桶系列--边双联通分量(eDCC)

边双连通分量(eDCC)是无向图的极大边连通子图,其内部无割边,不同分量通过割边连接。本文介绍了eDCC的定义、性质及Tarjan算法实现方法。算法基于DFS,通过比较dfn和low值识别分量,使用栈存储节点。文中提供了完整的C++模板实现,包括初始化、加边、运行算法和获取结果的方法,支持处理含重边的情况。该模板可高效计算图的边双连通分量及割边。

2025-12-16 22:12:58 229

原创 Tarjan算法图论全家桶系列--割边(桥)

割边是指删除后会增加图连通分量数量的边,具有必须是树边、不能是重边等性质。Tarjan算法基于DFS,通过dfn和low数组判断割边条件。文章提供了C++模板实现,包含邻接表输入接口和割边获取功能,适用于无重边图。该算法时间复杂度为线性,能高效找出所有割边。

2025-12-15 14:09:25 427

原创 Tarjan全家桶系列--割点

无向图中割点的定义及其Tarjan算法实现。割点是指删除该节点后图连通分量增加的节点。Tarjan算法基于DFS,使用dfn和low数组记录访问顺序和可达最小时间戳。判断割点的条件包括:非根节点u存在子节点v满足low[v]>=dfn[u],或根节点u拥有多个子树。文章提供了C++模板实现,包含邻接表输入接口和结果获取方法,时间复杂度为线性。

2025-12-14 15:19:07 167

原创 Tarjan全家桶系列--强联通分量

强连通分量(SCC)是有向图中任意两节点互相可达的极大子图。Tarjan算法通过DFS遍历,利用dfn(访问时间戳)和low(最小可达dfn)值识别SCC:当low[u]==dfn[u]时,栈顶到u的节点构成一个SCC。文中提供了C++模板,包含dfs函数实现核心逻辑,Run方法初始化并执行算法,Get获取SCC编号数组。示例展示了如何初始化邻接表、调用算法并获取结果。该算法高效(O(V+E)),适用于有向图连通性分析。

2025-12-13 15:45:56 230

原创 Go结构体标签(Tag)解析

摘要 本文深入解析Go语言结构体标签(Struct Tag)的使用,涵盖JSON序列化、数据库映射和Gin框架应用等场景。文章首先通过常见问题引入结构体标签的必要性,然后详细讲解标签的基础语法规则和常用类型。重点剖析了JSON标签的各种用法和选项,包括字段映射、空值忽略和类型转换等特性。同时介绍了数据库操作中sqlx和Gorm框架的标签使用方式,以及Gin框架中的参数绑定标签。通过大量代码示例展示了结构体标签在实际开发中的强大功能,帮助开发者掌握这一重要特性,提升Go语言开发效率。

2025-12-09 15:34:33 753

原创 Go接口相等性比较指南

Go语言接口相等性比较解析 本文深入探讨Go语言接口的相等性比较原理与实践。首先解析接口的底层结构,包括iface和eface两种类型,并通过代码示例展示其内部表示。核心规则指出:接口相等需同时满足类型相同和值相等两个条件。文章重点剖析了三个常见"陷阱":接口包装nil指针时看似相等实则不等、切片/映射等不可比较类型导致的编译错误,以及浮点数NaN的特殊比较行为。针对这些问题,提供了使用反射比较和自定义比较函数等解决方案。通过底层原理与实战案例的结合,帮助开发者彻底理解并正确使用Go接口

2025-12-08 20:05:02 314

原创 Go并发基石:进程、线程与 Goroutine 的区别

《并发编程三大概念:进程、线程、协程解析》 本文深入剖析了并发编程中的三种核心概念: 进程:作为资源分配的最小单位,具有独立内存空间,创建开销大但隔离性好 线程:CPU调度的基本单位,共享进程资源,创建开销中等但需处理同步问题 协程(Goroutine):Go语言实现的用户态轻量级线程,创建开销极小,通过Channel实现安全通信 三者对比显示:进程隔离性最强但开销大,线程提高了并发度,而协程在易用性和性能间取得最佳平衡。Go语言的Goroutine通过轻量级设计、简单语法和高效调度,成为现代并发编程的优秀

2025-12-07 15:47:07 690

原创 Go并发编程核心:Goroutine解析

Go语言通过Goroutine实现了轻量级并发编程,其核心优势在于: 高效轻量:Goroutine仅需2-4KB栈空间,可轻松创建数万个 低开销:用户态切换速度快(纳秒级),远优于传统线程 简单易用:只需go关键字即可启动并发任务 强大调度:采用GMP模型(Goroutine-Machine-Processor)实现高效调度 关键实践: 使用channel和WaitGroup进行同步 控制并发数量避免资源耗尽 通过context管理Goroutine生命周期 注意共享数据保护 Goroutine使Go成为高

2025-12-06 17:55:17 627 1

原创 Go语言字符类型解析

Go语言提供了byte和rune两种字符类型:byte是uint8别名,用于处理ASCII字符;rune是int32别名,支持全Unicode字符。关键区别在于:byte占用1字节,仅支持ASCII;rune占用4字节,可处理中文、Emoji等多语言字符。字符串遍历时,推荐使用range或转换为[]rune以避免乱码。最佳实践包括:获取字符数用len([]rune(str)),英文处理用byte,多语言用rune。理解这两种类型的区别是Go字符串处理的基础。

2025-12-05 15:58:57 936

原创 Go语言核心优势浅析:从语法、并发生态到设计哲学

Go语言凭借其简洁的语法设计(无类、无继承、无异常)、原生的并发支持(goroutine和channel)、高效的开发体验(快速编译、单一可执行文件)以及出色的性能表现(接近C语言的执行效率),成为了云原生时代的首选语言。文章通过代码示例对比展示了Go语言在可读性、并发编程和部署便捷性上的优势,并列举了Docker、Kubernetes等成功案例,说明Go语言在工程实践中的卓越表现,特别适合追求高效开发和团队协作的场景。

2025-12-05 00:18:36 727

原创 关闭输入输出同步以提高C++的IO效率

默认情况下,C++的标准输入输出库(iostream)会与C语言的标准输入输出库(cstdio)进行同步,以确保二者之间的IO操作不会出现问题。但是,同步会带来一定的性能损失。

2024-01-23 13:14:24 2614 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除