
数据结构&算法
文章平均质量分 95
Lostgreen
这个作者很懒,什么都没留下…
展开
-
经典背包问题详解:从0-1背包到分组背包
背包类型物品限制遍历顺序时间复杂度0-1背包每个物品选1次逆序O(NV)完全背包物品无限正序O(NV)多重背包物品选s[i]次二进制拆分优化O(NVlogS)分组背包每组选一个物品组外逆序O(KV*M)原创 2025-02-21 22:01:08 · 1141 阅读 · 0 评论 -
从3个元素到n个元素:容斥原理的直观理解与公式推导
容斥原理(Inclusion-Exclusion Principle)是组合数学中一个非常重要的工具,用于计算多个集合的并集大小。它的核心思想是通过“加加减减”的方式,避免重复计数,从而准确地求出多个集合的并集大小。本文将从3个元素的容斥原理出发,逐步推导出n个元素的容斥原理公式,并给出直观的解释。原创 2025-02-13 15:10:16 · 1834 阅读 · 0 评论 -
探索数论:线性同余方程与中国剩余定理
在数论和计算机科学中,线性同余方程和中国剩余定理是两个非常重要的概念,它们不仅在理论上具有深刻的意义,而且在实际应用中也有着广泛的应用,例如密码学、计算机代数系统、编码理论等领域。本文将深入浅出地讲解线性同余方程和中国剩余定理的数学原理,并介绍相关的求解算法。线性同余方程是指形如以下形式的方程:其中,, , 是已知整数, 是未知整数, 表示模 运算。该方程的含义是:存在一个整数 ,使得 。线性同余方程的解的性质取决于 , , 之间的关系:求解线性同余方程的常用方法是扩展欧几里得算法。该算法不仅可以求原创 2025-02-13 12:25:25 · 836 阅读 · 0 评论 -
探索数论:欧拉函数的原理
欧拉函数(Euler’s Totient Function),记作ϕn,是数论中的一个重要函数,用于计算小于或等于正整数n且与n互质的正整数的个数。换句话说,欧拉函数ϕn给出了在1到n之间与n互质的整数的数量。原创 2025-02-12 15:50:47 · 1046 阅读 · 0 评论 -
探索乘法逆元:模运算下的新概念
本文介绍了乘法逆元相关的数论知识,并结合代码,介绍了扩展欧几里得算法。原创 2025-02-12 11:29:04 · 851 阅读 · 0 评论 -
探索约数:试除法,约数之和,最大公约数
通过本文的介绍,读者可以掌握约数相关算法的原理和步骤。希望本文能够帮助读者深入理解约数及其应用。如果你对约数或其他数论算法有更多疑问,欢迎在评论区留言讨论!原创 2025-02-11 20:32:41 · 1452 阅读 · 0 评论 -
探索质数:从试除法到质数筛
通过本文的介绍,读者可以掌握质数相关算法的原理、实现方法以及应用场景。希望本文能够帮助读者深入理解质数及其相关算法。如果对质数或其他数论算法有更多疑问,欢迎在评论区留言讨论!原创 2025-02-11 17:37:54 · 717 阅读 · 0 评论 -
探索二分图:染色法与匈牙利算法
染色法:用于判定图是否为二分图,时间复杂度为OVEO(V + E)OVE。匈牙利算法:用于求解二分图的最大匹配,时间复杂度为OV×EOV×E。通过本文的介绍,读者可以掌握二分图的基本概念、染色法判定二分图的原理、匈牙利算法进行二分图匹配的原理与实现。希望本文能够帮助读者深入理解二分图及其应用。原创 2025-02-11 14:52:20 · 1362 阅读 · 0 评论 -
拓扑排序:任务调度背后的逻辑
给定一个有向无环图GVEG = (V, E)GVE,拓扑排序是将图中所有顶点排成一个线性序列,使得对于每一条有向边uv(u, v)uv,顶点uuu在顶点vvv之前。拓扑排序是解决有向无环图中依赖关系问题的有效算法。通过本文的介绍,读者可以掌握拓扑排序的定义、原理、实现方法以及应用场景。结合代码实现和题目讲解,希望读者能够深入理解拓扑排序,并在实际问题中灵活运用。如果你对拓扑排序或其他图论算法有更多疑问,欢迎在评论区留言讨论!原创 2025-02-11 00:02:41 · 1089 阅读 · 0 评论 -
探索图的遍历方式:深度优先遍历与宽度优先遍历
重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。原创 2025-02-10 15:49:05 · 805 阅读 · 0 评论 -
探索图论算法:最小生成树的构建之道(二)
本文将详细介绍Kruskal算法的背景、理论推导、正确性证明,并与Prim算法进行对比,帮助读者深入理解这两种算法的核心思想及其适用场景。Kruskal算法是一种高效且直观的最小生成树算法,其贪心选择性质保证了算法的正确性。与Prim算法相比,Kruskal算法更适合边数较少的场景,而Prim算法更适合顶点数较少的场景。Kruskal算法是一种贪心算法,用于在加权连通图中找到最小生成树。Kruskal算法的核心在于其贪心选择性质:每次选择当前最优的边(即最小权重的边)加入生成树,并确保不形成环。原创 2025-02-10 11:29:31 · 968 阅读 · 0 评论 -
探索图论算法:最小生成树的构建之道(一)
Prim算法是一种高效且直观的最小生成树算法,其贪心选择性质保证了算法的正确性。通过优先队列的优化,Prim算法的时间复杂度可以进一步降低,适用于大规模图的处理。理解Prim算法的核心思想和实现细节,不仅有助于解决实际问题,也为学习其他图论算法奠定了坚实的基础。其基本思想是从一个顶点开始,逐步扩展生成树,每次选择一条连接生成树和非生成树顶点的最小权重边,直到所有顶点都被包含在生成树中。Prim算法的核心在于其贪心选择性质:每次选择当前最优的边(即最小权重的边)加入生成树。是最小生成树的一部分。原创 2025-02-10 10:05:43 · 886 阅读 · 0 评论 -
SPFA算法详解:高效的单源最短路径算法
介绍spfa算法求解最短路和判断负环的思路原创 2025-02-09 12:18:39 · 893 阅读 · 0 评论 -
Bellman-Ford算法详解:带限制的最短路径算法
详细介绍Bellman-Ford算法,并解释其检测负环的原理原创 2025-02-09 10:37:01 · 1156 阅读 · 0 评论 -
Floyd算法:多源最短路径的经典解法
FloydFloydFloyd算法是一种用于求解多源最短路径问题的动态规划算法,由RobertWFloydRobertWFloyd于196219621962年提出。它能够计算图中任意两点之间的最短路径,适用于带权有向图或无向图,且可以处理负权边(但不能处理负权环)。Floyd算法是解决多源最短路径问题的经典算法,适用于中小规模的图。通过动态规划的思想和三重循环的实现,它能够高效地计算任意两点之间的最短路径。原创 2025-02-08 18:33:44 · 675 阅读 · 0 评论 -
Dijkstra算法:从理论到实践
Dijkstra算法是解决单源最短路径问题的经典算法,由荷兰计算机科学家Edsger W. Dijkstra于1956年提出。它适用于带权有向图或无向图,且权重必须为非负数。Dijkstra算法是图论中最基础且重要的算法之一。通过本文的代码实现和详细解析,读者可以深入理解其工作原理,并掌握如何在实际问题中应用该算法。无论是学术研究还是工程实践,Dijkstra算法都是不可或缺的工具。通过不断学习和实践,我们可以在算法的世界中走得更远!原创 2025-02-08 16:25:00 · 1067 阅读 · 0 评论 -
双向BFS:八数码问题的高效解法
双向BFS通过巧妙的双向夹逼策略,在八数码问题中展现了惊人的效率。这种算法思想启示我们:当面对复杂问题时,换个角度思考,往往能找到突破困境的新路径。正如计算机科学大师Dijkstra所说:“问题的解决往往不在于更强的算力,而在于更聪明的策略。原创 2025-02-08 11:43:31 · 1069 阅读 · 0 评论 -
广度优先搜索(BFS)算法详解——以走迷宫问题为例
通过走迷宫问题,我们不仅掌握了BFS的精髓,更体会到算法设计中"简单与高效"的完美统一。从古老的迷宫谜题到现代的网络路由,BFS算法始终闪耀着智慧的光芒。当您下次面对复杂问题时,不妨想想这个简单的队列,它或许就是打开问题之门的钥匙。思考题:如何修改算法使其可以输出具体的最短路径?tips:试着维护一个ppp数组,记录每一个走过的节点的父节点试试呢)原创 2025-02-07 21:58:16 · 1444 阅读 · 0 评论 -
深入浅出深度优先搜索(DFS)——以经典N皇后问题为例
想象你面前有一张8∗88 * 88∗8的国际象棋棋盘,现在需要摆放888个皇后,使得任意两个皇后都无法互相攻击。这个看似简单的谜题,自184818481848年被提出以来吸引了无数数学家与计算机科学家的目光。当我们把棋盘扩展到N∗NN*NN∗N规格时,就诞生了著名的N皇后问题。本文将带您通过这个经典问题,深入理解深度优先搜索(DFS)这一重要的算法思想。深度优先搜索(Depth-First Search)采用"不撞南墙不回头"的策略,其运行过程就像探险者深入洞穴:1.3 算法特性分析时间复杂度:O(b原创 2025-02-07 20:53:43 · 1049 阅读 · 0 评论 -
深入理解KMP算法:高效字符串匹配
KMP算法是一种用于在文本串中查找模式串的高效算法。它的核心在于利用模式串的部分匹配表(也称为next数组或ne数组),在匹配失败时跳过不必要的比较,从而减少匹配次数。关于KMP与朴素字符串匹配算法的区别可以参照下图感受一下。nextnext[i]表示模式串p中,从第1个字符到第i个字符组成的子串(即p[1...i])的最长相同前缀和后缀的长度。前缀是指从第1个字符开始的子串,后缀是指以第i个字符结尾的子串。next。原创 2025-02-06 18:56:52 · 1088 阅读 · 0 评论 -
深入理解Trie树:高效存储与查询字符串
Trie树是一种树形数据结构,通常用于处理字符串。它的每个节点代表一个字符,从根节点到某个节点的路径表示一个字符串的前缀。Trie树的一个重要特性是,具有相同前缀的字符串会共享路径上的节点,这使得它在处理大量字符串时非常高效。Trie树是一种非常强大的数据结构,特别适合处理字符串的存储和查询。通过共享字符串的公共前缀,Trie树能够显著减少存储空间,并且在查询时具有极高的效率。原创 2025-02-06 09:42:18 · 989 阅读 · 0 评论 -
哈希表与散列表的原理及C++实现
哈希表(Hash Table)是一种高效的数据结构,用于存储键值对(Key-Value Pairs)。它通过哈希函数(Hash Function)将键(Key)映射到一个固定大小的数组(称为散列表)中的某个位置,从而实现快速的插入、查找和删除操作。哈希表的核心思想是通过哈希函数将键转换为数组的索引,从而直接访问对应的值。理想情况下,哈希表的插入、查找和删除操作的时间复杂度都是O(1)。哈希表是一种高效的数据结构,通过哈希函数将键映射到数组索引,从而实现快速的插入、查找和删除操作。原创 2025-02-05 20:39:15 · 1198 阅读 · 0 评论 -
堆(Heap)的原理与C++实现
堆(Heap)是一种特殊的树形数据结构,通常用于实现优先队列。最大堆(Max Heap):每个节点的值都大于或等于其子节点的值。最小堆(Min Heap):每个节点的值都小于或等于其子节点的值。堆通常是一个完全二叉树,这意味着除了最后一层,其他层都是完全填满的,并且最后一层的节点都尽可能地靠左排列。堆是一种非常高效的数据结构,特别适用于需要频繁获取最大或最小元素的场景。通过数组实现堆,可以充分利用其完全二叉树的性质,使得插入、删除和构建堆的操作都能在 O(log n) 的时间内完成。原创 2025-02-05 17:49:21 · 1618 阅读 · 0 评论 -
扩展域并查集 & 带权并查集
扩展域并查集通过拆分域来表示复杂关系,逻辑直观且易于理解。虽然空间开销较大,但在处理复杂关系问题时非常高效。带权并查集通过维护权值来表示节点之间的关系,路径压缩和权值更新确保了高效的关系推导。虽然逻辑稍复杂,但代码简洁且高效,适合处理类似食物链的问题。原创 2025-02-04 14:50:09 · 1034 阅读 · 0 评论