算法
文章平均质量分 80
终末圆
前后端,二次元爱好者
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
双指针算法【算法 18】
双指针算法以其高效性和简洁性,在处理数组和字符串问题时展现出强大的能力。通过灵活应用双指针技术,我们可以解决许多看似复杂的问题。上述示例只是双指针算法应用的冰山一角,实际上,双指针算法的应用远不止于此,包括但不限于数组去重、寻找数组中的最大/最小子数组和、字符串匹配等。希望本文能够激发你对双指针算法的兴趣,并在未来的算法学习中加以应用。原创 2024-09-27 23:42:40 · 705 阅读 · 0 评论 -
双向链表:实现、操作与分析【算法 17】
首先,我们需要定义双向链表的节点。每个节点包含三个部分:存储的数据、指向下一个节点的指针(或引用)以及指向前一个节点的指针(或引用)。原创 2024-09-22 22:24:26 · 686 阅读 · 0 评论 -
静态链表:实现、操作与性能优势【算法 16】
然而,在算法竞赛或需要高效内存管理的环境中,传统的动态链表可能会因为内存分配和释放的开销而影响性能。由于数组在物理上是连续的,因此我们需要一个特殊的标记来表示链表的结束,通常可以使用一个特定的索引值(如-1或数组长度)来表示空指针。在静态链表中添加节点时,首先需要从空闲链表中获取一个空闲节点,然后设置其数据和下一个节点的索引。静态链表的实现相对简单,且由于所有节点都在同一个连续的内存块中,调试时也更容易跟踪和定位问题。静态链表的节点在物理上是连续的,这有利于CPU缓存的利用,提高了数据访问的效率。原创 2024-09-21 23:11:20 · 561 阅读 · 0 评论 -
Hotohiko Sakamoto算法,以及用其计算星期几【算法 15】
初始化:使用欧拉筛法找出小于或等于2n的所有素数。构建排列:从后往前遍历序列,对于每个位置i,找到大于i的最小素数minp,使得minp - i仍然位于1到n的范围内。填充数组:将minp - i填入数组的第i个位置,并继续向前处理剩余位置,直到数组完全填充。Tomohiko Sakamoto算法的核心在于通过一个精心设计的公式来计算出给定日期(年、月、日)对应的星期数。该算法避免了复杂的历法计算,仅通过简单的算术运算即可得出结果。原创 2024-09-12 20:42:03 · 1513 阅读 · 0 评论 -
桶排序【算法 14】
桶排序是一种适用于特定数据分布的高效排序算法,特别适合均匀分布的数据集合。在大多数情况下,它可以达到线性时间复杂度,因此在处理某些数值排序问题时非常实用。然而,桶排序对输入数据的分布有较高要求,因此在使用时需考虑数据特性。原创 2024-08-31 22:19:54 · 1002 阅读 · 0 评论 -
前缀和&差分【算法 13】
前缀和适合频繁的区间查询,其核心在于通过预处理将区间求和问题简化为常数时间查询。差分数组适合频繁的区间修改,其核心在于记录变化,而不是直接修改原数组。通过灵活使用这两种工具,我们可以高效地处理许多涉及区间的算法问题。原创 2024-08-30 21:51:28 · 906 阅读 · 0 评论 -
并查集【算法 12】
并查集是一种极为高效的数据结构,特别适用于动态连通性问题。通过路径压缩和按秩合并的优化,保证了其在实际应用中的高效性。原创 2024-08-29 23:07:55 · 761 阅读 · 0 评论 -
归并排序简介【算法 11】
归并排序(Merge Sort)是一种有效的、稳定的、基于分治法的排序算法。它的核心思想是将数组分成更小的部分,分别进行排序后再合并。归并排序具有 (O(n \log n)) 的时间复杂度,在处理大规模数据时表现优异。原创 2024-08-28 23:39:59 · 877 阅读 · 0 评论 -
线性表与C语言实现【算法 10】
顺序表是将线性表中的元素按顺序存储在一段连续的存储空间中。在C语言中,通常用数组来实现顺序表。100// 定义顺序表的最大容量// 存放顺序表元素的数组int length;// 顺序表的长度} SeqList;链表通过指针来存储数据,每个节点包含一个数据域和一个指向下一个节点的指针。int data;// 数据域// 指针域,指向下一个节点线性表是数据结构中的重要概念,顺序存储结构和链式存储结构各有优缺点。在顺序表中,查询速度快,但插入和删除操作效率低;原创 2024-08-27 23:04:42 · 909 阅读 · 0 评论 -
二分查找【算法 09】
二分查找是一种高效且常用的算法,特别适用于在大规模有序数据中查找目标值。无论是通过迭代还是递归实现,二分查找都能在 O(log n) 时间内完成查找操作,是每位程序员都应掌握的基础算法之一。通过掌握二分查找,不仅能提升算法设计的能力,还可以在面试中应对各种查找相关的题目。原创 2024-08-26 22:20:10 · 1060 阅读 · 0 评论 -
快速幂算法【算法 08】
快速幂算法的核心思想是将指数分解为二进制形式,利用“幂的二次方”特性,将时间复杂度从O(n)(常规幂运算需要乘法 n 次)降低到O(log n)。快速幂算法通过减少幂运算的次数,从而将时间复杂度降到了对数级别。它在各种实际场景中的应用展现了其高效性和实用性。如果你需要处理大整数幂次运算,快速幂无疑是一个理想的选择。原创 2024-08-24 22:39:27 · 1285 阅读 · 0 评论 -
背包问题【算法 07】
背包问题最早由丹麦数学家 Knuth 提出,其核心思想是:在一组物品中,每个物品都有一定的价值和重量,在背包的容量有限的前提下,选择哪些物品可以使得背包内物品的总价值最大化。背包问题可以表述为:给定n个物品,每个物品i有一个重量w_i和价值v_i,在背包最大承重量W限制下,如何选择物品,使得装入背包的物品总重量不超过W,且总价值最大。w_iv_iWmax∑i1nviximaxi1∑nvixi其中,x_i表示第i个物品是否被选中,x_i = 1表示选择,原创 2024-08-23 23:11:35 · 1176 阅读 · 0 评论 -
约瑟夫环问题【算法 06】
JnkJn−1kknJnkJn−1kkn通过递归分析和迭代优化,约瑟夫环问题可以通过 ( O(n) ) 时间复杂度来解决。该问题不仅在计算机科学中有重要的应用,也是一个经典的数学模型问题。原创 2024-08-22 21:10:46 · 1478 阅读 · 0 评论 -
三种简单排序:插入排序、冒泡排序与选择排序 【算法 05】
选择排序算法是一种简单直观的排序算法。它的工作原理是首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素为止。本文将介绍三种常见的排序算法:插入排序、冒泡排序和选择排序,并给出它们的C++实现。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。原创 2024-08-17 23:35:23 · 547 阅读 · 0 评论 -
【算法 04】汉诺塔递归求解和通式求解
这是因为每次递归调用都会将问题规模减半(实际上是n-1),导致总的递归深度为n,而每一步递归都需要进行两次子问题的递归调用(除了基本情况),因此总的时间复杂度是指数级的。它告诉我们,即使面对看似复杂的问题,只要能够将其分解为更小的子问题,并找到子问题之间的递推关系,我们就能够逐步逼近并最终找到问题的解。首先,我们明确汉诺塔问题的递归性质:为了将n个圆盘从A移动到C,我们可以先将n-1个圆盘(不包括最大的那个)借助C移动到B,然后将剩下的最大圆盘直接移动到C,最后再将那n-1个圆盘从B借助A移动到C。原创 2024-08-16 23:16:49 · 1280 阅读 · 0 评论 -
【算法 03】雇佣问题
雇用问题”不仅是一个有趣的算法问题,更是一个具有实际应用价值的优化问题。通过合理的算法设计和成本分析,我们可以在保证找到优秀候选人的同时,最大限度地降低招聘过程中的成本。希望今天的分享能够帮助你更好地理解这个问题,并在未来的工作和生活中找到更多的应用场景。原创 2024-08-06 23:00:25 · 624 阅读 · 0 评论 -
【算法 02】一题学习BFS和DFS算法
通过这道题,我们复习了图的深度优先搜索(DFS)和广度优先搜索(BFS)两种遍历算法,并了解了它们在实际问题中的应用。同时,我们也学会了如何使用邻接表来表示图,并如何通过递归和队列来实现DFS和BFS的遍历过程。希望这次解析能够帮助大家更好地理解和掌握这两种重要的图遍历算法。原创 2024-08-05 23:10:47 · 1573 阅读 · 0 评论 -
【算法 01】快速排序算法与分治思想
分治策略的核心在于“分而治之”,即将一个难以直接解决的大问题,分解成一些规模较小的相同问题,递归地解决这些子问题,然后将子问题的解合并成原问题的解。快速排序正是这一思想的完美体现。快速排序通过分治策略,将一个大的排序问题分解为多个小的排序问题,然后递归地解决这些子问题,最终完成整个数组的排序。这种思想不仅体现在快速排序中,也广泛应用于其他算法和问题解决中,是计算机科学中不可或缺的重要思想之一。原创 2024-07-31 17:14:51 · 657 阅读 · 0 评论
分享