- 博客(103)
- 收藏
- 关注
原创 c++算法之高级数据结构篇 - 树上分治之动态分治
动态点分治(Dynamic Centroid Decomposition)是一种高效处理动态树路径问题的算法。它通过预先构建重心树(Centroid Tree)来保持树的分治结构稳定,并为每个重心配备树状数组作为“账本”记录子树信息。算法支持修改节点权值和查询距离特定节点不超过K的权值和:修改时沿重心树递归更新账本;查询时通过容斥原理逐层累加合法贡献。关键优势在于将动态维护的复杂度从静态点分治的O(N log² N)降低到每次操作O(log² N)。实现步骤包括重心树构建、树状数组设计以及基于容斥的查询策略
2025-10-29 10:27:57
948
原创 c++算法之高级数据结构篇 - 树上分治之静态分治
本文系统性地讲解了静态点分治算法,针对树结构问题提出高效的分治解决方案。主要内容包括: 算法思想:通过寻找树的重心将大树分解为平衡子树,确保每次分治问题规模至少减半。 实现步骤: 重心查找:通过DFS计算各节点不平衡值 统计路径:收集重心到各点距离,用双指针统计合法点对 去重处理:减去同一子树内的非法统计 递归求解:对分解后的子树重复上述过程 复杂度优势:基于重心分解性质,保证O(NlogN)时间复杂度,显著优于暴力解法。 完整实现:提供了C++代码框架,包含重心查找、距离统计、双指针计数等核心模块。 该算
2025-10-29 10:19:12
970
原创 c++算法之高级数据结构篇 - Tarjan算法求LCA
Tarjan算法是一种高效的离线LCA(最近公共祖先)求解算法,巧妙结合DFS与并查集。其核心思路是在DFS过程中标记已访问节点,并通过并查集维护访问路径:当访问节点u时,若查询对象v已被访问,则LCA(u,v)即为v所在集合的代表节点;回溯时将子节点集合合并到父节点。算法时间复杂度接近O(n+Qα(n)),远优于在线算法,但需提前收集所有查询。典型实现使用邻接表存储查询,配合路径压缩优化的并查集,在DFS递归中完成查询应答。该算法体现了"整体处理"的离线思维优势,适合批量查询场景。
2025-10-29 10:13:26
841
原创 c++算法之高级数据结构篇 - 倍增法求LCA(重发)
本文详细介绍了倍增法求解最近公共祖先(LCA)的算法原理与实现步骤。通过类比"爬楼梯"与"坐电梯"的方式,生动阐述了倍增法的核心思想——借助二进制拆分实现快速跳转。文章系统性地讲解了预处理阶段如何通过DFS构建深度数组和二维祖先表,以及查询阶段如何通过深度对齐和共同提升两个步骤快速定位LCA。最后提供了完整的C++实现代码,并对关键步骤进行详细注释,帮助读者全面掌握这一高效算法。文章采用循序渐进的教学方式,从基础概念到具体实现,再到性能分析,形成完整的学习闭环。
2025-10-29 10:08:15
910
原创 c++算法之高级数据结构篇 - 倍增法求LCA问题
本文详细介绍了最近公共祖先(LCA)问题的倍增算法解决方案。首先通过家族族谱的比喻引入LCA概念,说明其在树结构中的重要性。接着分析朴素"向上标记法"的局限性,进而提出更高效的倍增法:通过预处理每个节点的2^k级祖先构建"电梯系统",实现快速跳跃查询。文章详细讲解了预处理阶段的DFS实现和查询阶段的二进制拆分技巧,并给出完整的C++代码实现。最后通过复杂度分析证明该方法能在O(NlogN)预处理和O(logN)查询时间下高效解决问题。
2025-10-04 10:07:42
1057
原创 c++算法之高级数据结构篇 - 简单树上问题
本文介绍了树结构中的两个重要概念——树的重心和树的直径,并提供了相应的算法实现。树的重心是使删除后最大子树最小的节点,可通过一次DFS遍历计算子树大小来高效找到;树的直径则是树中最长路径,采用两次BFS/DFS的巧妙方法:先任选起点找到最远端点,再从该端点出发找到直径。文章详细解析了两种算法的实现思路和代码,包括邻接表表示法、DFS/BFS遍历技巧,并通过具体示例演示了计算过程。最后总结了算法特性并指出常见陷阱,如无向图处理、递归终止条件等。这些方法在时间复杂度上均为O(N),具有较高的实用价值。
2025-10-04 10:05:06
619
原创 c++算法之高级数据结构篇 - 简单树上问题(1)
文章摘要: 本文以生动比喻和代码示例讲解树的两个关键性质:重心与直径。重心是树的“平衡点”,删除后能使最大子树最小化,可通过DFS计算子树大小动态求解;直径是树中最长路径,利用两次BFS/DFS(任选一点找最远点,再从此点找最远点)高效定位。代码实现均附详细注释,并配手动模拟过程,帮助理解算法核心。全文以“组织架构图”类比树结构,邻接表存储,强调DFS/BFS的遍历逻辑,适合初学者掌握树的基础操作与经典问题。
2025-10-04 10:02:22
643
原创 ZROJ篡改猴美化脚本0.1测试
ZR学生?ZR美化!!!背景可以用我之前就发的网页美化better美化:https://download.youkuaiyun.com/download/Ycx20120927/91555320?spm=1001.2014.3001.5503免积分下载!!!
2025-10-04 09:42:10
176
原创 篡改猴脚本食用教程[特殊字符]
本文简要介绍了如何在Chrome浏览器中安装和使用篡改猴(Tampermonkey)扩展。首先需要在Chrome扩展商店搜索并安装篡改猴扩展,安装完成后点击扩展图标进入管理界面。用户可以添加新脚本,将所需脚本代码粘贴进去后按Ctrl+S保存即可使用。该教程帮助用户快速掌握篡改猴的基本使用方法,为浏览器功能扩展提供便利。
2025-10-04 09:41:01
295
原创 c++算法之高级数据结构篇 - 块状列表
文章摘要: 块状列表是一种平衡数组和链表优点的数据结构,通过分块管理实现高效操作。它将数据分成多个块(每个块大小约√n),结合数组的快速查找(O(1))和链表的快速插入/删除(O(√n))。C++实现中,用vector<vector<int>>存储数据块,动态调整块大小:插入时检查块是否过大并分裂,删除时检查块过小则合并相邻块。核心操作包括operator[]快速定位、insert/erase维护块平衡,以及split_block/rebalance等辅助函数,整体实现了O(√n)时
2025-10-03 20:22:01
876
原创 c++算法之高级数据结构篇 - 莫队与分块
本文系统介绍了分块算法和三种莫队算法的原理与实现。分块算法通过将数据划分为√n大小的块,支持区间查询和修改,时间复杂度为O(√n)。基础莫队算法利用查询排序和指针移动优化离线区间查询,达到O(n√n)的时间复杂度。带修改莫队增加了时间维度,支持修改操作,时间复杂度为O(n^(5/3))。树上莫队通过欧拉序将树结构转化为线性序列,适用于树上路径查询。四种算法各有特点:分块实现简单,基础莫队适合离线查询,带修改莫队支持修改操作,树上莫队处理树结构问题。文章提供了完整代码示例,并建议从分块开始循序渐进学习这些算法
2025-09-26 11:08:32
853
原创 c++算法之高级数据结构篇 - 可持久化线段树(2)
本文介绍了一种基于可持久化权值线段树的高效区间第k大查询算法。该方法通过离散化处理原始数据,构建保存历史版本的可持久化线段树,利用版本差值计算区间数值分布,并通过二分查找实现O(logn)的单次查询。相比直接排序的O(nlogn)方法,该算法将预处理时间优化至O(nlogn),总时间复杂度降为O((n+m)logn)。文章详细阐述了离散化处理、权值线段树构建、查询操作等实现步骤,并提供了优化技巧和应用扩展。该算法在空间复杂度O(nlogn)的前提下,能高效解决区间统计问题,是处理大规模数据查询的有力工具。
2025-09-26 10:49:39
328
原创 c++算法之高级数据结构篇 - 可持久化线段树(1)
可持久化线段树是一种高效保存历史版本的数据结构,通过"路径更新"机制实现。它在保留旧版本的同时,每次更新仅创建O(logn)个新节点,空间复杂度为O(nlogn)。核心应用包括区间第k大查询、可持久化数组和区间不同数统计等。实现时采用权值线段树和离散化技术,查询和更新均为O(logn)时间复杂度。该结构特别适合需要版本管理或历史查询的场景,是处理高级区间问题的有力工具。
2025-09-26 10:41:53
967
原创 c++算法之高级数据结构篇 - 线段树(4)
本文系统介绍了三种区间处理算法:区间合并用于处理一维重叠区间(如会议室预订),通过排序和遍历实现;扫描线算法将二维平面问题转化为一维事件处理(如计算矩形面积并),通过离散化和状态维护实现;二维线段树(树套树)支持高效二维区间查询和更新(如图像处理),采用分层结构实现。三种方法各具特点:区间合并简单高效(O(nlogn)),扫描线巧妙实用(O(nlogn)),二维线段树功能强大但实现复杂(O(nm)空间)。选择方法需考虑问题维度、数据规模和应用场景,建议根据实际需求权衡时间空间复杂度与实现难度。
2025-09-26 10:37:19
1027
原创 c++算法之高级数据结构篇 - 线段树(3)
本文介绍了线段树在区间最值和历史最值查询中的应用。区间最值问题通过构建树形结构(每个节点存储对应区间的最大值/最小值),将查询复杂度从O(n)降至O(logn)。历史最值则在节点中额外存储历史极值信息,支持对数据历史状态的追踪。文章详细阐述了两种情况的实现方法,包括数据结构设计、查询过程、更新策略和Lazy-Tag机制,并提供了股票分析和游戏排行榜等应用场景。核心思想是通过预处理和分治策略,用空间换时间来实现高效区间查询,其中历史最值需要更复杂的标记维护机制来记录和传递历史状态信息。
2025-09-25 14:27:07
649
原创 c++算法之高级数据结构篇 - 线段树(2)
本文详细介绍了线段树区间查询和修改的实现原理,重点讲解了Lazy-Tag(延迟标记)技术。区间查询通过递归分解查询区间,在O(logn)时间内完成;区间修改引入Lazy-Tag机制,通过延迟标记和标记下推,同样实现O(logn)时间复杂度。文章还探讨了多种标记组合、优先级处理、优化技巧等高级应用,并通过具体示例演示了Lazy-Tag的工作流程,最后总结了核心概念和关键要点,为学习线段树提供了系统指导。
2025-09-25 14:14:15
342
原创 c++算法之高级数据结构篇 - 树状数组
树状数组(BIT)是一种高效处理动态前缀和查询的数据结构,通过二进制分块管理实现O(logn)的单点更新和前缀查询。其核心是lowbit函数,利用二进制特性快速定位管理区间。相比线段树,树状数组代码更简洁、常数更小,特别适合处理一维/二维的区间和、逆序对统计等问题。典型应用包括:单点更新区间查询、区间更新单点查询(差分)、求逆序对、动态第k小等。进阶可扩展至二维矩阵、结合离散化处理大数据等问题。掌握树状数组能显著提升算法竞赛中区间问题的解决效率。
2025-09-25 14:00:37
885
原创 c++算法之高级数据结构篇 - 并查集(4.基本操作)
并查集是一种高效处理集合合并与查询的数据结构,通过树形结构表示元素的分组关系。每个集合由根节点标识,支持初始化、查找和合并三大操作。查找操作通过路径压缩优化,将节点直接连接到根节点;合并操作采用按秩合并保持树结构平衡。优化后操作时间复杂度接近O(1),适用于社交网络、图像连通性分析等场景。典型应用包括Kruskal算法和朋友圈问题求解,其空间效率高且实现简单,是处理动态连通性问题的理想选择。
2025-09-25 13:54:20
735
原创 c++算法之高级数据结构篇 - 并查集(3.合并的优化)
文章摘要: 合并优化是并查集的核心技术,通过智能合并策略(按秩或按大小)保持树结构平衡,避免退化为链表,将操作复杂度从O(n)降至O(α(n))。按秩合并基于树高度,仅当秩相等时更新;按大小合并则依据节点数,始终将小树合并至大树下。两者均能与路径压缩协同,实现接近常数级的查询效率。合并优化广泛应用于连通性问题、最小生成树、网络分析等场景,其核心思想是通过控制数据结构平衡性提升性能,体现“智能策略+多技术协同”的优化哲学。代码实现需注意初始化、路径压缩及合并方向选择等关键细节。
2025-09-25 13:50:15
592
原创 c++算法之高级数据结构篇 - 并查集(2.路径压缩详解)
路径压缩是并查集的核心优化技术,通过将查找路径上的节点直接指向根节点,大幅提升查询效率。其核心思想类似于建立"直达祖先的高速公路":第一次查找时记录路径,后续查询即可直接访问。路径压缩可将时间复杂度从O(n)优化至接近O(1),实现方式包括递归(简洁)和迭代(高效)两种。典型应用包括连通性判断、Kruskal算法等场景,与按秩合并结合可达到最佳性能。虽然会改变树结构且不可回退,但路径压缩带来的百倍性能提升使其成为处理集合合并与查询问题的利器。
2025-09-25 13:49:07
757
原创 c++算法之高级数据结构篇 - 并查集(1.简要)
本文系统介绍了并查集数据结构。并查集是处理元素分组和查询的高效工具,核心操作包括查找(Find)和合并(Union)。文章详细讲解了基础实现、优化方法(路径压缩和按秩合并)以及带权变种,分析了其O(α(n))的优异时间复杂度。通过社交网络、连通性检测等应用示例,展示了并查集在图论算法中的重要作用。最后总结了选择建议和使用注意事项,为读者提供了这一"超级管家"数据结构的完整指南。
2025-09-25 13:47:14
348
原创 c++算法之搜索篇(提高) - IDDFS和IDA*
IDDFS和IDA算法是两种智能搜索方法,结合了DFS的空间效率和BFS/启发式搜索的最优性。IDDFS通过迭代加深深度限制,在无权图中寻找最短路径,空间复杂度仅O(d)。IDA在此基础上加入启发式函数f(n)=g(n)+h(n),适用于带权图的最优路径搜索,在可采纳启发函数下保证最优解。两者都采用线性空间存储,避免内存爆炸问题。IDDFS适合简单迷宫、树结构搜索,而IDA更适用于复杂路径规划和拼图游戏。主要区别在于IDA使用启发式引导搜索,效率更高但实现更复杂。选择时应根据问题特性:简单无权图用IDDFS
2025-09-25 13:41:47
827
原创 c++算法之搜索篇(超级提高) - A*算法
A算法是智能路径规划的核心算法,它结合了Dijkstra算法的最优性保证和贪心搜索的高效性。算法通过评估函数f(n)=g(n)+h(n)进行决策,其中g(n)是实际路径代价,h(n)是启发式估计。关键特性包括:使用可采纳启发函数保证最优解(如曼哈顿距离、欧几里得距离),通过一致性条件提升效率。相比Dijkstra的全方位搜索和贪心搜索的单一方向性,A能智能平衡路径长度与搜索方向,广泛应用于游戏AI、机器人导航和物流规划。优化技术包括双向搜索、动态权重调整等,未来可与机器学习结合发展更智能的启发函数。
2025-09-25 12:59:28
1659
原创 c++算法之搜索篇(提高) - BFS与双向队列
本文介绍了双向队列(deque)及其在BFS算法中的应用。双向队列支持两端操作,比普通队列更灵活。重点讲解了0-1 BFS算法,该算法针对边权重仅为0或1的图,通过将0权重节点加入队列前端、1权重节点加入后端来优化搜索效率。文章详细说明了算法实现步骤,提供了C++代码示例,并分析了时间复杂度和空间复杂度。此外,还探讨了实际应用场景(如迷宫求解、网络路由等)、常见问题解决方案以及优化策略。双向队列BFS结合了BFS的简单性和优先队列的灵活性,是处理特定图问题的有效工具。
2025-09-25 12:42:33
716
原创 c++算法之搜索篇(提高) - DFS与优先队列
本文介绍了BFS与优先队列结合的Dijkstra算法及其应用。通过类比旅行规划,说明优先队列能智能选择最优路径。文章详细讲解了优先队列的实现方式、Dijkstra算法的核心思想与步骤,包括C++代码示例。分析了算法复杂度,并与普通BFS进行对比。介绍了GPS导航、网络路由等实际应用场景,以及A*算法等进阶内容。最后提供了城市最短路径的完整示例,并给出学习建议。全文系统性地阐述了如何利用优先队列优化BFS,为处理带权图的最短路径问题提供了实用解决方案。
2025-09-25 12:39:59
820
原创 c++算法之搜索篇 - 双向广搜
双向广搜(Bidirectional BFS)是一种高效的图搜索算法,它同时从起点和终点出发进行广度优先搜索,当两个搜索相遇时即找到最短路径。该算法通过将搜索空间减半,显著提高了搜索效率,时间复杂度从普通BFS的O(b^d)降为O(b^(d/2)),尤其适用于无权图的最短路径问题。实现方式包括交替扩展和按层扩展,后者通过优先扩展较小的队列来优化性能。典型应用包括单词接龙、迷宫最短路径等问题。虽然双向广搜在内存使用和实现复杂度上存在局限,但通过选择扩展方向、设置终止条件等技巧可进一步优化。对于特殊场景,可考虑
2025-09-25 11:26:43
905
原创 c++算法之搜索篇 - BFS与最短路径
摘要:BFS(广度优先搜索)是一种用于无权图的最短路径算法,其核心思想是"涟漪扩散"式逐层遍历。本文详细介绍了BFS的基本概念、工作原理(使用队列实现)、C++实现方法,以及如何记录和回溯最短路径。重点讲解了BFS在迷宫求解和社交网络关系链等实际应用,并对比了BFS与DFS、Dijkstra等其他算法的特点。文章还探讨了BFS的优化方向(如双向BFS)和常见问题解决方案,最后总结了BFS作为图论基础算法的重要地位及未来发展方向。
2025-09-25 11:20:00
847
原创 c++算法之搜索篇 - 洪水填充
洪水填充算法是一种基础图像处理技术,通过从一个起始点扩散填充相连区域,广泛应用于图像编辑、游戏开发和图像分析等领域。本文详细介绍了洪水填充的工作原理、核心要素(起始点、目标颜色和填充颜色)以及四种实现方法:递归实现(简单但易栈溢出)、栈实现(避免递归问题)、队列实现(BFS方式)和高效的扫描线算法。文章还分析了不同实现的时间复杂度、优化策略(如并行处理和内存优化),并提供了实际应用案例,包括图像编辑器、迷宫求解和连通区域检测。尽管算法简单直观,但在处理大型图像时仍需注意性能优化。未来发展方向包括GPU加速和
2025-09-25 11:13:07
685
原创 c++算法之搜索篇 - 剪枝
本文系统介绍了算法优化中的剪枝技术及其应用。首先通过园艺修剪类比解释剪枝概念,强调其能显著降低时间/空间复杂度。其次详细分析BFS中的判重技术,包括布尔数组、哈希表和位运算三种实现方法,并通过迷宫最短路径问题给出代码示例。最后阐述三种剪枝类型:可行性剪枝(跳过无效路径)、最优性剪枝(忽略次优解)和搜索顺序剪枝(优化遍历顺序),分别结合八皇后、背包等问题说明实现原理。这些技术能有效提升算法效率,使原本不可解的问题变得可行。
2025-09-24 13:22:56
435
原创 c++算法之搜索篇 - BFS与DFS基础
本文介绍了两种基础图搜索算法:广度优先搜索(BFS)和深度优先搜索(DFS)。BFS采用"水波扩散"式搜索,使用队列实现,适合最短路径等问题;DFS则沿着路径深入探索,可用递归或栈实现,适用于拓扑排序等场景。文章详细讲解了两种算法的工作原理、C++实现代码(包括递归和迭代版本)、时间/空间复杂度分析,并通过可视化示例说明执行过程。这些算法在路径查找、网络爬虫、社交网络分析等领域有广泛应用,是计算机科学中的重要基础。
2025-09-24 13:19:54
393
原创 c++算法之基本算法篇 - 贪心与拟阵
本文系统介绍了贪心算法的基本概念、核心要素、理论基础及经典应用。贪心法是一种基于局部最优选择的算法设计思想,其核心在于贪心选择性质和最优子结构性质。文章通过自助餐厅等生活实例生动解释了贪心法的特点,并详细阐述了拟阵作为贪心算法理论基础的关键作用。重点分析了三个经典贪心算法问题:活动选择问题(按结束时间排序)、哈夫曼编码(合并最小频率)和最小生成树问题(Kruskal和Prim算法),通过C++代码实现展示了具体应用。文章强调,虽然贪心法不能保证所有问题的最优解,但在满足特定条件时,其简单高效的特点使其成为解
2025-09-24 13:16:46
966
原创 c++算法之基本算法篇 - 分治法
分治法是一种重要的算法设计思想,通过"分而治之"策略将复杂问题分解为若干相同形式的子问题。本文详细介绍了四个经典分治算法:1.汉诺塔问题(O(2^n)时间复杂度)展示递归分治思想;2.快速幂运算(O(logn)时间复杂度)通过数学分解降低计算复杂度;3.归并排序(O(nlogn)稳定排序)采用分治策略实现高效排序;4.快速排序(O(nlogn)平均时间复杂度)基于基准元素分区排序。这些算法体现了分治法的核心三步骤:分解、解决、合并,适用于可分解且子问题解可合并的问题。文章还提供了C++代
2025-09-24 13:10:46
423
原创 c++算法之基本算法篇 - 排序与排列
C++标准库提供了强大的排序和排列工具,包括sort()、stable_sort()、partial_sort()等排序函数,以及next_permutation()等排列生成算法。这些工具支持自定义比较规则,适用于各种场景,如学生成绩管理、旅行路线规划等。使用时需注意算法选择(考虑时间复杂度和稳定性)、初始排序状态对排列生成的影响,以及自定义比较函数的正确性。对于大数据量,应考虑性能优化技巧如预分配内存。掌握这些核心算法能显著提升编程效率,是解决实际问题的利器。
2025-09-24 13:05:11
653
原创 c++算法之基本算法篇 - 前缀和与差分
传统方法:每件商品价格相加(1+3+5+7+9=25)前缀和方法:提前计算"累计价格表"第1件:1第2件:1+3=4第3件:1+3+5=9第4件:1+3+5+7=16第5件:1+3+5+7+9=25当需要计算第3到第5件商品价格时,只需用第5件的累计价格减去第2件的累计价格:25-4=21前缀和就像提前准备好的"累计价格表",让我们能快速计算任意区间的和。前缀和(Prefix Sum)是一种预处理技术,通过预先计算数组的前n项和,使得任意区间和查询能在O(1)时间内完成。
2025-09-24 09:18:15
768
原创 c++算法之基本算法篇 - 倍增法与ST算法
本文系统介绍了倍增法和ST算法这两种高效算法。倍增法通过预处理2的幂次步长信息,将线性复杂度降为对数级,适用于树形结构查询(如LCA问题);ST算法则通过构建稀疏表预处理所有2的幂次长度区间,实现O(1)时间的静态区间查询(如RMQ问题)。文章详细阐述了两种算法的核心思想、实现方法、应用场景及优化技巧,并提供了C++代码示例。这两种算法都体现了"空间换时间"和分治思想,是算法设计中的重要工具,适用于网络路由、金融分析、社交网络等多个领域。掌握这些算法不仅能解决特定问题,更能培养高效的算法
2025-09-24 09:06:09
516
原创 c++算法之基本算法 - 三分法
你派两个人分别从山脚两侧出发,走到山腰的两个对称位置(比如山脚到山顶距离的1/3和2/3处)比较两人所在位置的高度:如果左边的人(1/3处)比右边的人(2/3处)高,说明山峰在左侧部分如果右边的人比左边的人高,说明山峰在右侧部分如果两人高度相同,说明山峰在两人之间这样每次都能排除掉1/3的山体范围,快速缩小搜索范围。这就是三分法的核心思想!三分法(Ternary Search)是一种在单峰函数(或单谷函数)上寻找极值点的算法。
2025-09-24 08:53:13
1021
better-V3新版本
2025-11-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1