
算法·命运
文章平均质量分 79
超华东算法王
微信号:yoggyzh
重磅推出:更新ing:Java难点解读,百战大厂面试; 即将更新系列:自传统编程:rust语言之旅,go语言之旅,c#语言之旅,swift语言之旅,oc语言之旅,Lua语言之旅 黑皮书之旅1:算法导论,neo4j之旅,redis之旅;python高级:opencv3.0,chatgpt,LLM,python-WEB,数据开发,web安全,SQL高级,大数据基础,linux高级,hadoop技术栈,hive
展开
-
【算法·命运-39】匈牙利算法二分图最大匹配
匈牙利算法 是一种用于解决 二分图最大匹配 问题的经典算法。它能够在 时间复杂度 O(V \times E) 下找到给定二分图的最大匹配。在一个二分图 G=(U,V,E)G = (U, V, E) 中:最大匹配 是指找到一个边的子集,使得:匈牙利算法是基于 增广路径 的贪心算法,依赖于以下思想:通过找到增广路径,将路径上的匹配边和非匹配边反转(匹配变为非匹配,非匹配变为匹配),从而使匹配数增加 1。4. 算法分析时间复杂度:每次寻找增广路径的复杂度为 O(E),其中 EE 是图中的边数。 最原创 2024-11-27 09:48:19 · 866 阅读 · 0 评论 -
【算法·命运-38】染色法二分图
是一种特殊的图结构,其节点可以分成两个不相交的集合 AA 和 BB,使得图中所有的边都连接 AA 和 BB 中的节点,而不存在任何连接集合内部节点的边。是一种有效的判定二分图的算法。原创 2024-11-27 09:47:38 · 711 阅读 · 0 评论 -
【算法·命运-37】Kruskal算法
Kruskal 算法是一种经典的贪心算法,适用于求解加权无向图的最小生成树。它通过边的排序,逐步选择最小权重的边,并使用并查集来避免形成环。时间复杂度:O(E log E),适合稀疏图。与Prim 算法相比,Kruskal 算法对于边数较少的图效果更佳。原创 2024-11-27 09:40:32 · 913 阅读 · 0 评论 -
【算法·命运-36】prim算法
Prim 算法是一个经典的贪心算法,用于求解图的最小生成树。时间复杂度:O(E log V)(使用优先队列时),O(V²)(使用邻接矩阵时)。优点:适合稠密图,能够动态地扩展生成树,计算最小生成树的效率较高。缺点:对于稀疏图,可能不如 Kruskal 算法高效。原创 2024-11-27 09:39:47 · 650 阅读 · 0 评论 -
【算法·命运-35】Floyd算法
Floyd-Warshall 算法:适用于多源最短路径问题,能够处理负权边,并且能有效地计算所有节点对之间的最短路径。时间复杂度为 O(V³),适用于节点数较少的图。负权环检测:通过检测最短路径矩阵的对角线元素,如果,则说明存在负权环。适用场景:适合小规模的图,尤其是当需要计算多个源点的最短路径时。对于大规模图,尤其是边数较多的图,Floyd-Warshall 算法的效率较低。原创 2024-11-27 09:39:14 · 664 阅读 · 0 评论 -
【算法·命运-34】SPFA算法
SPFA 是 Dijkstra 算法和 Bellman-Ford 算法结合的一种算法,通过使用队列来优化松弛过程。该算法通常使用队列来动态地选择下一个需要松弛的节点,而不是像 Bellman-Ford 那样固定进行V-1次松弛。SPFA 可以大大减少不必要的松弛操作,因此在大多数情况下比 Bellman-Ford 更快,接近 O(E log V) 的时间复杂度,但最坏情况下仍然可能达到 O(V * E)。SPFA 算法:是。原创 2024-11-26 21:51:43 · 817 阅读 · 0 评论 -
【算法·命运-33】bellman-ford算法
优点可以处理负权边,适用于含有负权边的图。可以检测图中是否存在负权环。适合小图或者边数较少的图,算法简单且易于实现。缺点时间复杂度 O(V * E),对于图较大时,性能较差,不适用于大规模图的单源最短路径问题。Bellman-Ford 算法是一个非常重要的单源最短路径算法,它能处理负权边并检测负权环,适用于较小规模或较稀疏的图。其时间复杂度 O(V * E) 较高,但由于其简单性和通用性,在许多图论问题中具有广泛应用。原创 2024-11-26 21:50:58 · 646 阅读 · 0 评论 -
【算法·命运-32】Dijkstra及其变种
Dijkstra 算法:适用于非负权重的图,时间复杂度 O((V + E) logV),常用于单源最短路径问题。A算法*:Dijkstra 的变种,适用于路径规划,使用启发式函数加速搜索。Bellman-Ford 算法:适用于含有负权边的图,时间复杂度 O(V * E),可检测负权环。Johnson 算法:适用于所有节点对最短路径问题,能够处理负权边,但没有负权环,时间复杂度 O(V^2 * logV + VE)。Floyd-Warshall 算法。原创 2024-11-26 21:50:23 · 949 阅读 · 0 评论 -
【算法·命运-31】拓扑排序topsort
拓扑排序是解决依赖关系问题的有力工具,常见于任务调度、图的排序和路径问题中。两种常见的拓扑排序算法(Kahn 算法和 DFS 算法)都能在 O(V + E) 时间复杂度内解决问题,但它们的实现方式不同,可以根据具体需求选择使用。它将图中的所有节点排列成一个线性序列,使得对于图中的每一条有向边。DFS 基于图的递归特性,可以通过递归实现拓扑排序。DFS 算法通过递归访问节点,确保节点的邻接节点在当前节点之前被访问,从而满足拓扑排序的条件。原创 2024-11-26 21:49:14 · 877 阅读 · 0 评论 -
【算法·命运-30】树和图的广度优先搜索
是一种图和树的遍历算法,特点是访问节点。与深度优先遍历(DFS)不同,BFS 会首先访问起始节点的所有邻接节点,然后访问其邻接节点的邻接节点,以此类推,直到所有可达节点都被访问。原创 2024-11-26 21:44:20 · 944 阅读 · 0 评论 -
【算法·命运-29】树和图的深度优先搜索
和的深度优先遍历(DFS, Depth-First Search)是图和树结构遍历的一种基本方法。DFS 是一种深入每个分支,直到不能再深入为止的遍历方式。遍历过程中,当一个节点的所有邻接节点都被访问过后,算法会回溯到上一个节点继续探索其他未被访问的邻接节点。树是图的一种特殊形式,所以树和图的 DFS 遍历方法是类似的,唯一的区别在于树没有环(每个节点只有一个父节点),而图可能有环(因此需要特别处理)。原创 2024-11-26 21:43:47 · 426 阅读 · 0 评论 -
【算法·命运-28】BFS广度优先搜索
是一种用于图(graph)或树(tree)遍历的算法。与深度优先搜索(DFS)不同,BFS 是,从起始节点开始,先访问与起始节点距离为 1 的节点,再访问距离为 2 的节点,以此类推。BFS 通常用于寻找最短路径问题、图的连通性判断等场景。原创 2024-11-26 21:42:57 · 675 阅读 · 0 评论 -
【算法·命运-27】DFS深度优先搜索
是一种用于遍历或搜索图(graph)或树(tree)结构的算法。DFS 从一个起始节点开始,沿着图的深度遍历节点,尽可能深地搜索一个分支,直到无法继续,才会回溯并继续探索其它未遍历的分支。原创 2024-11-26 21:40:09 · 912 阅读 · 0 评论 -
【算法·命运-26】快排堆排比较
对于。原创 2024-11-26 16:04:06 · 1080 阅读 · 0 评论 -
【算法·命运-25】python优先级队列
在 Python 中,优先队列可以通过。原创 2024-11-26 15:27:49 · 673 阅读 · 0 评论 -
【算法·命运-24】实用的Counter
在 Python 中,是一个非常有用的类,它是一个,用于计数可哈希对象的出现次数。Counter会将对象作为键,计数(次数)作为值,因此它是非常适合做频率统计或计数的问题。Counter可以用于很多场景,比如统计字符频率、单词频率、某些物品的出现次数等。它提供了一些特别的功能,简化了这些常见任务。CounterCounter可以通过传入一个可迭代对象(如列表、字符串等)来初始化,或者通过字典来初始化。原创 2024-11-26 13:15:19 · 466 阅读 · 0 评论 -
【算法·命运-23*】最大流
最大流问题(Maximum Flow Problem)是图论中的一个经典优化问题,目标是在给定一个流网络(即一个带有容量的有向图)中,找到从源点 ss 到汇点 tt 的最大流量。流网络中的每条边有一个容量,表示从一端到另一端的最大允许流量。流的一个基本要求是:对于每个节点,进入流量等于流出的流量,除了源点和汇点。最大流问题的一个常见应用场景是:计算网络中最大信息传输量、交通网络中的最大运输能力等。原创 2024-11-25 14:15:25 · 752 阅读 · 0 评论 -
【算法·命运-22*】模拟退火算法
模拟退火算法借鉴了这一物理过程,用于解决优化问题,特别是在寻找全局最优解时,能够有效避免陷入局部最优解。其中,ΔE=Enew−Ecurrent\Delta E = E_{\text{new}} - E_{\text{current}} 是能量差,TT 是当前温度,exp\exp 是指数函数。模拟退火算法的基本思想是:通过引入随机性和逐渐降低温度,使得搜索过程在初期具有较大的“跳跃性”,可以跳出局部最优解,在温度逐渐降低的过程中,最终趋向全局最优解。如果邻域解的能量比当前解更差,则以某个概率接受这个解。原创 2024-11-25 14:11:27 · 623 阅读 · 0 评论 -
【算法·命运-21*】mobius函数
莫比乌斯函数(通常表示为 μ(n)\mu(n))是数论中的一个重要函数,它在许多数学领域,特别是在素数分解、数的因子和代数数论中扮演着重要角色。莫比乌斯函数用于描述整数 nn 的质因子结构,并与数论中的一些重要定理(如中国剩余定理、逆卷积等)有紧密关系。原创 2024-11-25 14:10:25 · 612 阅读 · 0 评论 -
【算法·命运-20】HashTable
哈希表是一种键值对(key-value)数据结构,它通过哈希函数将键映射到一个数组的索引位置,以便快速存储和查找数据。它是实现快速查找、插入和删除的高效工具,广泛应用于许多场景,如数据库索引、缓存、符号表等。哈希表是一种非常高效的数据结构,特别适合快速查找、插入和删除操作。通过适当的冲突处理策略和合理的负载因子控制,可以有效提高哈希表的性能。它广泛应用于各种需要高效查找的场景,如缓存、数据库索引、计数统计等。原创 2024-11-25 13:58:50 · 840 阅读 · 0 评论 -
【算法·命运-19】heap
堆排序的优缺点优点时间复杂度为 O(nlogn)O(n \log n),性能稳定。原地排序算法,空间复杂度为 O(1)O(1)。不依赖递归或栈。缺点对数据的初始顺序不敏感,可能比快速排序稍慢。不稳定排序,两个相同元素的相对位置可能改变。堆的常见应用优先队列:高效维护最大值或最小值。Top K 问题:如查找第 K 大或第 K 小的元素。最短路径算法:如 Dijkstra 算法中利用堆优化。合并 K 个有序链表:使用最小堆高效处理。原创 2024-11-25 13:58:10 · 324 阅读 · 0 评论 -
【算法·命运-18】并查集
并查集(Union-Find,也叫,简称 DSU)是一种用于处理集合合并与查询的问题的数据结构,特别适用于解决连通性问题,如判断两个元素是否在同一集合、合并两个集合等。它通常用于动态连通性的问题,广泛应用于图的处理、网络连接、社交网络等领域。原创 2024-11-25 13:57:29 · 827 阅读 · 0 评论 -
【算法·命运-17】Trie树
Trie(又称为字典树或前缀树)是一种树形数据结构,用于高效地存储和查找字符串集合。它的基本思想是将所有字符串按字符逐层拆分,并将共享前缀的部分合并。Trie 通常用于字符串查找、词频统计、自动补全、前缀匹配等场景。原创 2024-11-25 13:56:56 · 286 阅读 · 0 评论 -
【算法·命运-16】KMP
KMP 算法通过利用模式字符串中的已知信息,避免了不必要的字符比较,从而大大提高了匹配效率。它的核心是构建部分匹配表,通过这个表帮助我们在文本与模式不匹配时跳过一些已经比较过的字符,从而实现更高效的字符串匹配。这种算法广泛应用于字符串匹配、文本编辑器中的搜索等领域,特别适合处理长文本和多次查询的情况。原创 2024-11-25 13:49:54 · 906 阅读 · 0 评论 -
【算法·命运-15】单调队列
单调栈通过维护栈内的单调性,可以高效解决一类区间或顺序相关的问题,特别是在需要查找下一个更大/更小值时。它的时间复杂度通常是 O(n)O(n),因为每个元素最多被压入栈和弹出栈一次。掌握单调栈的模板和应用,可以帮助快速解决相关的面试和竞赛问题。原创 2024-11-25 13:48:22 · 235 阅读 · 0 评论 -
【算法·命运-14】单调栈
单调栈通过维护栈内的单调性,可以高效解决一类区间或顺序相关的问题,特别是在需要查找下一个更大/更小值时。它的时间复杂度通常是 O(n)O(n),因为每个元素最多被压入栈和弹出栈一次。掌握单调栈的模板和应用,可以帮助快速解决相关的面试和竞赛问题。原创 2024-11-25 13:47:36 · 397 阅读 · 0 评论 -
【算法·命运-13】队列
队列(Queue)是一种先进先出(FIFO,First In First Out)数据结构,即最早加入队列的元素最先被移除。队列常见的应用包括任务调度、消息传递、打印任务队列等。原创 2024-11-25 13:46:47 · 365 阅读 · 0 评论 -
【算法·命运-12】栈
栈(Stack)是一种后进先出(LIFO,Last In First Out)数据结构,即最后插入的元素最先被移除。栈常常用于程序中的各种任务,如函数调用、表达式求值、浏览器历史记录等。原创 2024-11-25 13:46:07 · 332 阅读 · 0 评论 -
【算法·命运-11】双链表
双链表(Doubly Linked List)是链表的一种扩展形式,与单链表相比,每个节点包含两个指针:一个指向下一个节点,另一个指向前一个节点。这使得在双链表中,节点可以被从两端遍历,因此插入和删除操作通常更加高效。原创 2024-11-25 13:45:07 · 246 阅读 · 0 评论 -
【算法·命运-10】单链表
单链表(Singly Linked List)是一种线性数据结构,由一系列节点(Node)组成。每个节点包含两个部分:数据(Data)和指向下一个节点的指针(Next)。在单链表中,每个节点只能指向下一个节点,因此只能沿着链表的方向进行遍历。下面是一个简单的单链表实现的例子,使用 Python 编写。原创 2024-11-25 13:44:14 · 417 阅读 · 0 评论 -
【算法·命运-1】快速排序
快速排序是一种基于。原创 2024-11-24 18:55:18 · 341 阅读 · 0 评论 -
【算法·命运-2】mergesort
归并排序是一种基于。原创 2024-11-24 18:55:58 · 385 阅读 · 0 评论 -
【算法·命运-3】binarysearch
在一些问题中,需要找到满足条件的第一个或最后一个位置,需要对标准二分查找进行调整。给定一个排序数组和一个目标值,在数组中找到目标值的插入位置。需要分别找到目标值的第一个位置和最后一个位置,可以使用二分查找分别定位。,请在数组中找到目标值,并返回其索引。假设按照升序排序的数组在预先未知的某个点进行了旋转,例如,数组。:设定查找的初始范围为数组的整个区间,定义左指针。需要修改二分查找算法,当未找到目标值时,返回。由于数组被旋转,可以使用二分查找的变形来解决。,找出给定目标值在数组中的开始位置和结束位置。原创 2024-11-24 18:56:54 · 749 阅读 · 0 评论 -
【算法·命运-4】高精度
高精度运算通过模拟手算过程,可以在编程语言的数据类型限制下处理超大数字的加减乘除。这些算法虽然效率不如使用内置大数类型(如 Python 的。原创 2024-11-24 19:36:10 · 318 阅读 · 0 评论 -
【算法·命运-9】区间合并及其例题
O(nlogn)O(n \log n),其中 nn 是区间的数量。插入新区间并排序的时间复杂度是 O(nlogn)O(n \log n),合并区间的时间复杂度是 O(n)O(n)。排序的时间复杂度是 O(nlogn)O(n \log n),遍历区间的时间复杂度是 O(n)O(n)。排序的时间复杂度是 O(nlogn)O(n \log n),遍历区间的时间复杂度是 O(n)O(n)。区间合并是一个典型的排序和合并问题,最重要的是根据区间的起始位置进行排序,再根据合并的规则逐步合并区间。原创 2024-11-24 19:40:59 · 385 阅读 · 0 评论 -
【算法·命运-8】离散化及其例题
离散化(Discretization)是将连续的数据或区间转化为离散的数值或元素的过程,广泛用于处理数据中的范围或区间问题。离散化的核心思想是把一个范围(通常是实数范围)转化为一个有限的、离散的数值集合,以便于进行计算或存储。: 给定一个区间列表,每个区间有一个开始和结束位置,要求通过离散化后的索引来进行区间内的最大值查询。: 给定一组二维坐标点,要求将所有坐标点进行坐标压缩,使得所有的坐标值变得离散,且映射为连续的整数。:O(nlogn)O(n \log n),其中 nn 是区间数量。原创 2024-11-24 19:40:10 · 768 阅读 · 0 评论 -
【算法·命运7】位运算及其例题
给定一个非空整数数组,除了一个元素只出现一次以外,其他每个元素均出现两次,找出这个唯一的元素。进行操作的技术,速度快且高效,是计算机底层运算的基础。: 给定一个整数数组,其中两个元素只出现一次,其余所有元素均出现两次,找出这两个元素。:O(k)O(k),其中 kk 是二进制中1的个数。: 给定一个整数,统计其二进制表示中1的个数。: 给定一个整数数组,返回该数组的所有子集。:O(n)O(n),nn 为二进制位数。,返回它们的和(用二进制表示)。: 判断一个整数是否是2的幂。位运算是一种直接对整数的。原创 2024-11-24 19:39:31 · 320 阅读 · 0 评论 -
【算法·命运-6】 双指针算法及其例题
双指针算法是一种常用的高效算法技巧,主要用于数组、链表等线性数据结构的操作。: 给定两个数组,找出它们的交集,并且每个元素在结果中出现的次数应与它在两个数组中出现的次数一致。双指针算法通过灵活调整指针的移动,可以高效解决许多线性结构上的问题,是算法中非常实用的技巧之一。,找到数组中两个数的索引,使它们的和等于目标值。的最小长度的连续子数组,并返回其长度。如果不存在这样的子数组,返回。: 给定一个链表,判断链表中是否有环。: 给定一个升序排序的整数数组和一个目标值。,找出其中无重复字符的最长子串的长度。原创 2024-11-24 19:38:36 · 463 阅读 · 0 评论 -
【算法·命运-5】前缀和与差分
对于一个数组 a[]a[],前缀和数组 S[]S[] 的定义为:通过前缀和,可以快速计算区间 [l,r][l, r] 的和:对于一个数组 a[]a[],差分数组 d[]d[] 的定义为:d[i]=a[i]−a[i−1](其中 a[0]=0)d[i] = a[i] - a[i-1] \quad \text{(其中 \(a[0] = 0\))}通过差分数组,可以快速对数组中的区间进行加法操作。原创 2024-11-24 19:37:11 · 898 阅读 · 0 评论