算法
文章平均质量分 93
yingjuxia.com
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
正则表达式 – 语法
正则表达式(Regex)是一种强大的文本处理工具,用于匹配、搜索和替换字符串中的特定模式。它支持多种编程语言(如Kotlin、JavaScript)和Linux工具(如grep、sed)。核心语法包括元字符(如.、^、$)、量词(如*、+)、字符类(如\d、\w)以及捕获组。2025年,正则表达式仍是开发必备技能,尤其在Kotlin 2.0优化和JavaScript新增标志的背景下。实践场景包括邮箱验证、URL提取和日志分析,建议使用在线工具(如regex101.com)练习。原创 2025-09-18 09:03:54 · 1152 阅读 · 0 评论 -
数据结构寻路算法
寻路算法是图论中寻找最优路径的重要方法,主要包括BFS、Dijkstra、GBFS和A算法。BFS适合无权重图的最短路径搜索,Dijkstra适用于有权重图。GBFS虽速度快但不保证最短路径,A算法通过结合实际成本和启发式估算,在保证最优性的同时提高效率,成为游戏开发和导航系统的首选。算法选择需权衡路径质量、计算效率和适用场景。原创 2025-08-01 18:07:24 · 1903 阅读 · 0 评论 -
深度优先遍历与连通分量
文章摘要 深度优先遍历(DFS)是一种从起始节点深入探索的图遍历算法,通过递归或栈实现,适合识别无向图中的连通分量。连通分量是相互连通的顶点组成的极大子图,DFS通过遍历标记顶点,统计分量个数。算法时间复杂度为O(V+E),适用于网络分析等场景。尽管递归实现可能栈溢出,但DFS仍是图论中高效的基础算法。原创 2025-08-01 18:04:06 · 1124 阅读 · 0 评论 -
相邻节点迭代器
相邻节点迭代器详解 核心概念: 相邻节点迭代器是图论中用于遍历节点邻居的工具,支持邻接矩阵和邻接表两种实现方式。邻接表时间复杂度为O(deg(v)),效率更高;邻接矩阵为O(V),适合密集图。 实现方式: 邻接矩阵:遍历二维数组检查连接状态 邻接表:直接访问预存邻居列表 通过抽象Graph接口统一访问方式 应用价值: 作为DFS/BFS等图算法的基础组件,实现了算法与底层存储的解耦。其标准化接口设计提升了代码复用性和可维护性。 效率对比: 邻接表在稀疏图中优势明显,而邻接矩阵更适合边数接近完全图的情况。该迭原创 2025-08-01 18:01:31 · 776 阅读 · 0 评论 -
图论基础和表示
摘要 图论是研究顶点和边关系的数学分支,广泛应用于网络分析、路径规划等领域。图的基本概念包括顶点、边、有向/无向图、加权/非加权图及连通性。图的表示方法主要有三种:邻接矩阵(适合稠密图,查询O(1)但空间O(V²))、邻接表(适合稀疏图,空间O(V+E))和边列表(适合边操作频繁的场景)。选择表示方法需要权衡图的密度和操作需求,邻接矩阵适合稠密图的高效查询,邻接表则更适合稀疏图的存储和遍历。原创 2025-08-01 11:19:30 · 1110 阅读 · 0 评论 -
并查集路径压缩
路径压缩是并查集的一种优化技术,通过在查找操作中将路径上的节点直接连接到根节点,显著降低树的高度,使后续操作效率接近常数时间。研究表明,结合按秩合并后,平均时间复杂度可达O(α(n))。路径压缩特别适用于频繁查询场景,如Kruskal算法中的连通性检测,但在持久化并查集等特殊场景可能需要权衡。实现上只需在find函数中添加递归赋值即可完成优化。原创 2025-08-01 11:17:52 · 904 阅读 · 0 评论 -
并查集 rank 的优化
并查集的rank优化通过维护集合的树高度(rank)来优化合并操作,将较小rank的树合并到较大rank的树上,从而保持树的平衡性。研究表明,该优化结合路径压缩后,可使操作时间复杂度接近常数O(α(n)),显著提升动态连通性问题的处理效率。与size优化效果相似,但更关注树高控制,适用于最小生成树算法、社交网络分析等场景。争议点在于具体优化方法的选择可能因应用而异。原创 2025-08-01 11:15:50 · 925 阅读 · 0 评论 -
并查集 size 的优化
本文介绍了并查集(Union-Find)数据结构中的size优化方法。并查集是一种用于管理不相交集合的数据结构,size优化通过维护每个集合的大小,在合并时将较小的集合连接到较大的集合上,从而保持树的高度较低,提高查找和合并操作的效率。研究表明,这种方法能使时间复杂度接近常数O(α(n))。size优化与路径压缩和按秩合并一起,是并查集高效性的关键。文章详细解释了size优化的原理、实现步骤、性能分析及其应用场景,如动态连通性问题、最小生成树算法和社交网络分析等。同时比较了size优化与其他优化的异同,并讨原创 2025-08-01 11:14:34 · 759 阅读 · 0 评论 -
并查集快速合并
摘要 并查集(Union-Find)是一种用于管理不相交集合的数据结构,支持高效的查找(Find)和合并(Union)操作。快速合并通过优化Union操作实现,常用方法包括按秩合并(Union by Rank)和按大小合并(Union by Size),结合路径压缩后可使合并和查找操作的平均时间复杂度接近常数 (O(\alpha(n)))。未优化时,合并可能退化为 (O(n)),但优化后性能显著提升,适用于动态连通性问题、最小生成树算法等场景。争议点包括具体优化方法的选择(按秩或按大小)及未优化时的性能退化原创 2025-08-01 11:12:48 · 876 阅读 · 0 评论 -
并查集快速查找
摘要: 并查集通过路径压缩和按秩合并优化查找操作(find),使其平均时间复杂度降至接近常数((O(\alpha(n))))。未优化时最坏为 (O(n)),需结合优化确保性能。适用于动态连通性问题、最小生成树等场景。核心实现包括父节点数组和递归路径压缩,如 pa[x] = find(pa[x])。研究支持其高效性,但分割集合操作受限。参考资源包括OI Wiki和算法博客。(150字)原创 2025-08-01 11:11:09 · 910 阅读 · 0 评论 -
并查集基础
并查集基础讲解 并查集(Union-Find)是一种高效管理不相交集合的数据结构,支持动态合并与查询操作。其核心包括: 基本操作: 初始化时每个元素独立成集合 Find操作查找元素所属集合的代表元 Union操作合并两个集合 优化方法: 路径压缩(缩短查找路径) 按秩合并(保持树结构平衡) 性能: 平均时间复杂度为极优的O(α(n)),近乎常数 广泛应用于动态连通性问题、最小生成树算法等场景 典型应用包括社交网络关系判断、图的连通性分析等。通过简单数组即可实现,是解决集合合并与查询问题的高效工具。 参考资源原创 2025-08-01 11:09:34 · 986 阅读 · 0 评论 -
二分搜索树的特性
二分搜索树(BST)是一种具有有序特性的二叉树,其左子树节点值小于当前节点,右子树节点值大于当前节点,且子树本身也是BST。BST支持高效查找、插入和删除操作,平均时间复杂度为O(log n),但最坏情况下可能退化为O(n)的链表结构。由于性能依赖插入顺序,实际应用中常使用AVL树或红黑树等平衡结构优化。BST适用于数据库索引等需要动态数据管理的场景,但不允许重复键值且不保证完全平衡性。原创 2025-08-01 11:05:40 · 1076 阅读 · 0 评论 -
二分搜索树节点删除
二分搜索树节点删除操作分为三种情况:1)删除叶子节点时直接移除;2)删除含单子节点的节点时用子节点替换;3)删除双子节点时需先找到后继/前驱节点替换值再删除。操作需维护树的有序性,时间复杂度为O(h),平均O(log n)。后继节点法是常用实现方式,具体选择取决于实现需求。该操作可通过递归或迭代完成,需注意根节点等特殊情况处理。原创 2025-08-01 11:03:50 · 1047 阅读 · 0 评论 -
二分搜索树层序遍历
摘要: 层序遍历(Level Order Traversal)是一种广度优先遍历方法,按树的层次逐层访问节点,从根节点开始,从左到右处理。其实现依赖于队列:先将根节点入队,依次处理节点并将其子节点入队,直至队列为空。 特点: 顺序:输出结果不按二分搜索树的有序排列(需中序遍历)。 应用:适合计算树宽、序列化树结构或分层处理节点。 复杂度:时间复杂度O(n),空间复杂度O(w)(w为树的最大宽度)。 **示例代码(Java)**使用队列实现,确保层次化访问。注意区分层序遍历与其他遍历方式(如中序)的适用场景。原创 2025-08-01 11:02:06 · 710 阅读 · 0 评论 -
二分搜索树深度优先遍历
二分搜索树的深度优先遍历包括先序、中序和后序三种方式。先序遍历顺序为节点→左子树→右子树,适合复制树结构;中序遍历顺序为左子树→节点→右子树,能按升序访问节点,适用于排序;后序遍历顺序为左子树→右子树→节点,常用于删除树等操作。三种遍历可通过递归或栈实现,选择取决于具体应用场景。示例分析展示了不同遍历方式在具体树结构中的访问顺序。原创 2025-08-01 10:59:21 · 956 阅读 · 0 评论 -
二分搜索树节点的查找
二分搜索树(BST)节点查找通过比较键值递归或迭代地在左/右子树中定位目标节点,平均时间复杂度为O(log n),最坏情况下为O(n)。核心操作遵循BST性质(左子树值<节点值<右子树值),适用于数据库索引等场景。递归实现简洁但占用栈空间,迭代实现更节省内存。查找效率取决于树的平衡性,可通过AVL树等优化。示例代码展示了Java实现,适用于键值唯一的情况。原创 2025-08-01 10:53:56 · 741 阅读 · 0 评论 -
二分搜索树节点的插入
二分搜索树的节点插入操作通过比较键值递归或迭代找到合适位置,保持左子树值小于节点值、右子树值大于节点值的特性。平均时间复杂度为O(log n),最坏情况下退化为O(n)。插入方法包括递归(简洁但占用栈空间)和迭代(节省空间)两种实现。典型应用包括动态数据管理和数据库索引构建。示例展示了插入序列[5,3,7,2,4]的构建过程,最终形成平衡的二分搜索树结构。优化建议包括采用平衡二叉树来避免最坏情况。原创 2025-07-31 10:41:04 · 899 阅读 · 0 评论 -
二分搜索树
二分搜索树摘要 二分搜索树(BST)是一种基于二叉树的动态数据结构,具有以下特点: 有序性:左子树节点值均小于根节点,右子树节点值均大于根节点 高效操作:平均情况下查找、插入、删除的时间复杂度为O(logn) 退化风险:当数据有序插入时可能退化成链表,时间复杂度降为O(n) 应用广泛:适用于数据库索引、字典实现、范围查询等场景 优化方法包括平衡二叉搜索树(如AVL树、红黑树),通过旋转操作保持树平衡,确保最坏情况下仍维持O(logn)的时间复杂度。BST的中序遍历可输出有序序列,这一特性使其在有序数据处理中原创 2025-07-31 10:38:38 · 761 阅读 · 0 评论 -
索引堆及其优化
索引堆及其优化摘要 索引堆是一种改进的堆数据结构,通过维护索引数组和反向索引数组,实现了高效的动态元素修改(O(log n))。它支持传统堆操作(插入、删除堆顶)的同时,允许快速更新任意元素值,适用于优先级队列和图算法等场景。优化方法包括三路比较减少交换次数、结合插入排序处理小规模数据、缓存友好访问优化等。典型应用如Dijkstra算法中动态调整节点优先级。索引堆的时间复杂度为插入/删除/修改O(log n),空间复杂度O(n),在需要频繁修改元素的场景中性能显著优于传统堆。原创 2025-07-31 10:37:01 · 903 阅读 · 0 评论 -
优化堆排序
优化堆排序摘要 堆排序是一种高效的比较排序算法,通过构建最大堆实现升序排序,标准时间复杂度为O(n log n),空间复杂度O(1)。研究表明其性能可通过多种方法优化: 三路比较优化:减少约20%-30%的比较次数 结合插入排序:对小规模数据(n<50)效率提升显著 缓存友好优化:提高缓存命中率,运行时间减少10%-20% 并行化处理:利用多核处理器加速建堆和下沉操作 优化后的堆排序仍保持不稳定特性,适合大规模数据排序和内存受限环境,特别在重复元素多或小规模数据频繁出现的场景下表现更优。典型实现可结合原创 2025-07-31 10:35:42 · 716 阅读 · 0 评论 -
基础堆排序
堆排序是一种高效的比较排序算法,基于堆数据结构实现,时间复杂度为O(n log n)。它通过构建最大堆(或最小堆)并反复提取堆顶元素实现排序,具有原地排序特性(空间复杂度O(1)),但不稳定。核心操作包括建堆和下沉调整,适用于大规模数据排序和内存受限场景。示例展示了如何将数组[4,10,3,5,1]通过建堆和交换堆顶元素逐步排序为[1,3,4,5,10]。堆排序在最好、最坏和平均情况下均保持O(n log n)的时间效率,是算法设计中重要的排序方法之一。原创 2025-07-31 10:34:17 · 828 阅读 · 0 评论 -
堆的 shift down
摘要:堆的 Shift Down(下沉)操作详解 Shift Down 是维护堆性质的关键操作,主要用于删除堆顶或调整堆结构。其核心步骤为:将堆顶元素与其子节点比较(最大堆选较大子节点,最小堆选较小子节点),若不符合堆性质则交换,并重复此过程直至满足条件。时间复杂度为 (O(\log n)),空间复杂度为 (O(1))。 示例:删除最大堆 ([16,14,10,8,7,9,3]) 的堆顶 16 后,将末尾元素 3 移至堆顶,通过两次下沉(3→14→8)得到新堆 ([14,8,10,3,7,9])。代码实现通原创 2025-07-31 10:32:50 · 710 阅读 · 0 评论 -
堆的 shift up
**堆的 Shift Up(上浮)操作是维护堆性质的关键步骤,时间复杂度为 O(log n)。当新元素插入堆末尾时,通过与父节点比较并交换,逐步上浮到合适位置。适用于优先队列、堆排序等场景,空间复杂度为 O(1),是原地操作。示例展示了最大堆中插入元素 15 的上浮过程。该操作高效简单,但需注意父节点索引计算和堆性质维护。原创 2025-07-31 10:31:12 · 721 阅读 · 0 评论 -
堆的基本存储
堆是一种基于完全二叉树的高效数据结构,分为最大堆和最小堆,通过数组紧凑存储并利用索引关系(父节点(i-1)/2,左子节点2i+1,右子节点2i+2)实现快速访问。核心操作包括插入(O(log n)上浮)和删除堆顶(O(log n)下沉),适用于优先队列、堆排序等场景。数组存储节省空间(O(n)),但不适合随机查找。典型应用包括任务调度和Dijkstra算法,需注意索引计算避免越界。原创 2025-07-31 10:29:57 · 1048 阅读 · 0 评论 -
排序算法衍生问题
排序算法衍生问题摘要 排序算法衍生问题利用排序原理解决更高阶问题,如逆序对计数和寻找第n大元素。研究表明,归并排序可高效计算逆序对(O(n log n)),而快速选择算法能以平均O(n)时间复杂度定位第n大元素。这些方法广泛应用于算法面试、数据库查询和推荐系统,体现了基础算法的扩展价值。典型案例如通过修改归并排序统计逆序对,或使用分区策略快速定位元素次序,展示了算法思维的灵活性。 (150字)原创 2025-07-31 10:28:04 · 986 阅读 · 0 评论 -
三路排序算法
三路快速排序是一种改进的快速排序算法,特别适合处理含大量重复元素的数组。该算法通过将数组划分为小于、等于和大于基准值的三部分来提高效率,平均时间复杂度为O(n log n),空间复杂度为O(log n)。虽然实现较复杂且不是稳定排序,但在大型数据集和重复元素多的场景下表现优异。该算法源自快速排序的优化,在JDK等现代编程环境中被广泛应用。原创 2025-07-31 10:25:07 · 1194 阅读 · 0 评论 -
双路快速排序
双路快速排序是快速排序的改进算法,通过选择两个基准值将数组分为三部分(小于p1、介于p1-p2、大于p2),平均时间复杂度为O(n log n),特别适合处理含重复元素的数据。相比标准快速排序,它在重复元素较多时表现更优,但实现较复杂且最坏情况仍可能达到O(n²)。该算法被Java JDK 7+采用用于基本类型排序,结合了插入排序和归并排序的优点。虽然空间复杂度为O(log n)且不稳定,但在大数据集和通用排序场景中具有显著优势。原创 2025-07-31 10:23:58 · 913 阅读 · 0 评论 -
随机化快速排序
随机化快速排序是一种改进的快速排序算法,通过随机选择枢轴避免最坏情况,平均时间复杂度为O(n log n)。相比标准快速排序,它在处理已排序或特定分布数据时表现更稳定。算法通过随机选择枢轴、分区和递归排序实现,空间复杂度为O(log n)。虽然存在最坏情况O(n²)的可能性,但概率极低。适用于大型数据集和通用排序场景,但不是稳定排序。代码实现通常包括随机枢轴选择、分区和递归调用等步骤。原创 2025-07-31 10:20:50 · 874 阅读 · 0 评论 -
数据归并排序
归并排序是一种基于分治策略的高效排序算法,时间复杂度稳定为O(n log n)。它通过递归分解数组为单个元素后逐步合并有序子数组实现排序,具有稳定性,适合处理大型数据集。虽然需要O(n)额外空间,但在外部排序等场景中表现优异。算法步骤包括分解、排序子数组和合并,其稳定性和可预测性能使其成为数据库排序等应用的首选。典型实现使用辅助数组进行合并操作,在Java等语言中广泛应用。原创 2025-07-31 10:19:19 · 689 阅读 · 0 评论 -
数据希尔排序
希尔排序是一种改进的插入排序算法,通过分组插入排序逐步缩小增量实现高效排序。其核心思想是将数组按增量分组,对每组进行插入排序后减小增量重复操作,最终增量为1时完成排序。该算法时间复杂度通常为O(n^1.3)到O(n^2),空间复杂度O(1),适合中等规模或近乎有序的数据集。希尔排序不是稳定排序,但实现简单且原地操作,常用于空间受限场景。优化关键在于增量序列选择,如希尔增量、Knuth增量等。尽管在大数据场景下效率不及快速排序等算法,希尔排序仍是中等规模数据排序的有效选择。原创 2025-07-31 10:18:07 · 1065 阅读 · 0 评论 -
数据希尔排序
希尔排序是一种改进的插入排序算法,通过分组插入排序逐步缩小增量实现高效排序。其核心思想是将数组按增量分组,对每组进行插入排序后减小增量重复操作,最终增量为1时完成排序。该算法时间复杂度通常为O(n^1.3)到O(n^2),空间复杂度O(1),适合中等规模或近乎有序的数据集。希尔排序不是稳定排序,但实现简单且原地操作,常用于空间受限场景。优化关键在于增量序列选择,如希尔增量、Knuth增量等。尽管在大数据场景下效率不及快速排序等算法,希尔排序仍是中等规模数据排序的有效选择。原创 2025-07-31 10:17:37 · 975 阅读 · 0 评论
分享