数据结构与算法学习
文章平均质量分 60
星沁城
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
暴力的艺术——莫队
莫队算法是一种用于处理离线区间查询问题的优化算法,适用于静态数组上的多查询场景,如统计区间内不同数字的个数或众数等。其核心思想是通过分块和排序优化查询顺序,减少指针移动的浪费。具体来说,莫队将查询范围划分为若干块,先按左边界所在的块排序,若左边界在同一块内则按右边界排序。这种排序方式有效减少了指针移动的复杂度,使得整体时间复杂度从暴力处理的O(n^2)优化至O(n√n)。通过合理地调整查询顺序,莫队算法在处理大规模区间查询时显著提升了效率。原创 2025-05-14 13:22:39 · 1175 阅读 · 0 评论 -
跳跃表(跳表)是什么
正常链表只能一个一个往下走但是如果我直到我的目标位置就在链表的中部但是我还得一步一步走过去很浪费时间,所以跳表就是在正常链表的基础上添加了多步跳跃的指针。跳表(Skip List)是一种概率型的数据结构,它是基于链表的,通过创建多个层次的链表来加快搜索速度。每个节点不仅有指向下一节点的指针,还可能有指向更高层次节点的指针,从而实现快速跳跃。跳表的时间复杂度为 O(log n) 级别,适用于插入、删除和查找操作。原创 2025-01-03 22:15:55 · 1589 阅读 · 0 评论 -
敏感词过滤
基于DFA(Deterministic Finite Automaton,确定性有限自动机)算法的敏感词过滤是一种高效的方法。DFA算法通过构建一个状态机来匹配敏感词,其核心思想是将每个敏感词转换成一个状态机,然后通过遍历文本来检测敏感词。虽然DFA算法在很多场景下表现良好,但它并不是唯一的解决方案,也不一定是所有情况下最高效的算法,还有AC自动机和字典树(前缀树)等算法。适应快速定位查找的数据结构我们很容易想到HashMap,但我们的理想结构是类似底层HashMap(hash+树的结构)原创 2024-12-17 11:25:09 · 819 阅读 · 0 评论 -
二叉搜索树/平衡二叉搜索树
由于这些性质,二叉搜索树可以高效地进行查找、插入和删除操作。:平均情况下是O(log n),最坏情况下是O(n)(当树退化成链表时)。:平均情况下是O(log n),最坏情况下是O(n)。:平均情况下是O(log n),最坏情况下是O(n)。二叉搜索树的这些操作通常通过递归或迭代的方式实现。递归实现更为直观,而迭代实现可以避免递归带来的栈溢出问题。原创 2024-12-11 11:01:42 · 1220 阅读 · 0 评论 -
关键路径求解
在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(如完成活动需要的时间)。关键路径(Critical Path)是项目管理中的一个概念,它指的是项目中最长的任务序列,决定了完成项目所需的最短时间。关键路径上的任务称为关键任务,它们对项目的完成时间有直接影响。事件的最早发生时间ve,事件最迟发生时间vl,活动的最早发生时间ae,活动的最迟发生时间al,活动冗余时间d=al-ae。(1)在AOE网中仅有一个入度为0的顶点,称为开始顶点(源点),它表示整个工程的开始;原创 2024-12-11 10:47:09 · 690 阅读 · 0 评论 -
最小生成树
最小生成树(Minimum Spanning Tree,简称MST)是一个图论中的术语,它指的是一个图的边的子集,这个子集构成一个树,并且包含原图中的,同时这个树的边的总权重(即所有边的权重之和)是所有可能的生成树中最小的。原创 2024-12-11 10:44:38 · 1096 阅读 · 0 评论 -
算法——差分
差分可以看作是前缀和的逆运算,前缀和可以帮我们快速得到某个区间的和,而差分就是我们将原数组看作是一个前缀和数组(q[])我们去构造一个差分数组(c[])原创 2024-12-10 16:36:21 · 2041 阅读 · 0 评论 -
算法——前缀和
如果我们想要得到数组中一段区间的和最朴素的想法肯定是我们从区间的开始下标遍历到结束下标并累加,但是这显然存在一个问题,时间开销是O(n)的级别,并且有着大量的重复计算,求[n, m]的和后继续求[n…m…p]区间和,但是我们还是需要从n开始遍历而不是利用我们之前算过的结果,前缀和就可以帮我们减少重复计算。原创 2024-12-10 16:28:27 · 344 阅读 · 0 评论 -
迪杰特斯拉算法(Dijkstra‘s)
迪杰斯特拉算法(Dijkstra's algorithm)是由荷兰计算机科学家艾兹格·迪科斯彻(Edsger W. Dijkstra)在1956年提出的,用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。这个算法广泛应用于网络路由、地图导航等领域。原创 2024-11-21 22:21:57 · 2486 阅读 · 0 评论 -
背包问题(动态规划)
背包问题是一种组合优化的问题,它有多种变体,但最常见的两种是0/1背包问题和完全背包问题。原创 2024-11-20 23:00:03 · 1117 阅读 · 0 评论 -
并查集讲解
也是利用树形结构,每个员工(节点)都会记录自己的直接上级(父节点),如果一个节点没有上级就代表它是boss(一个公司只有一个boss),这个boss直接或间接管辖的所有员工,这个boss管辖下的员工自然是一伙的。现在我们来考虑这么一件事,如果B公司因为经营不善破产了,B公司的老板一看A公司发展的挺好的就先投靠A公司,A公司的老板想了想觉得划得来就同意了,但是他也想要B公司有经验的员工又不想打乱B公司的原本的管理架构,所以他想了个好办法只让B公司老板认他当上级其余不变,这就完美解决了问题。原创 2024-11-20 22:05:10 · 503 阅读 · 0 评论 -
树状数组——学习心得
对于sum[7] = t[4] + t[6] + t[7],而我们发现7-lowbit(7)=6,6-lowbit(6)=4,4-lowbit(4)=0,用x-lowbit(x)就能找到下一个需要的区间,同理x+lowbit(x)就能找到父节点。lowbit(x)的描述如下:求的是x的二进制表示下的最低位的1和此位后的0组成的值,如x = 4(100)时得到的就是100(4);根据上面解释的t[x]的含义,想必善于观察的同学已经发现了t[x]在图中的特点,我们可以举个栗子来归纳一下。就得到最后我们要的值。原创 2024-10-10 20:06:41 · 681 阅读 · 0 评论 -
排序算法——归并排序
摘要:归并排序采用分治思想,通过递归将数组拆分为最小有序单元(单个元素),再使用双指针合并有序子数组(O(n)时间复杂度)。其稳定性和O(nlogn)的时间复杂度使其适合处理大规模未知数据。文章通过Java代码示例展示了数组和链表两种实现方式:数组版本通过辅助数组进行合并操作,链表版本则利用快慢指针拆分和虚拟头节点合并。两种实现都遵循"拆分-排序-合并"的核心流程,最终输出完全有序的结果。原创 2024-10-10 20:00:55 · 350 阅读 · 0 评论 -
KMP算法学习(包含所有next数组的求解)
next_1数组就可以通过val[]数组得到,next_0[i] = val[i - 1] + 1(i > 0, 初始化next_0[0] = 0),大家先往下看之后会解释为什么。next_0数组的每一位都比next_1数组少1,也就是next_1[i] = val[i - 1] (i > 0, 初始化next_1[0] = -1)原创 2024-10-09 09:42:25 · 1936 阅读 · 0 评论 -
排序算法——快速排序:普通快排与双路快排
很显然对于普通的快排来说只能处理大于base和小于base的情况,对于等于base的情况我们是做的模糊处理(哪边先碰到算哪边的),所以在待排序数组中元素重复度比较高的情况下会退化为O(n^2)。如:4,4,4,4,4,1。选取待排序数组的首或尾元素作为枢轴(就是base,我们选出来的比较的数),大于base的放右边,小于base的放左边。我们每次只能一个元素一个元素的拆开,而不是理想情况一半一半的拆,为了处理以上情况有了双路快排。原创 2024-10-04 13:44:27 · 993 阅读 · 0 评论 -
算法——单调栈
保持栈内的元素始终递增或递减。原创 2024-10-04 13:40:39 · 375 阅读 · 0 评论 -
排序算法——堆排序:大根堆、小根堆
利用二叉树进行排序,有大根堆排序和小根堆排序。原创 2024-10-04 13:32:19 · 1106 阅读 · 0 评论 -
排序算法——桶排序
总的时间复杂度主要取决于桶内元素排序花费的时间,在最优情况下可以达到O(n+k),适用于数据分布均匀的情况下使用,不然容易变成普通快排一样大量数据堆积到一个桶内降低效率。原创 2024-10-04 13:28:55 · 570 阅读 · 0 评论 -
字典树(前缀树)
字典树(Trie树)又称前缀树,是一种树形结构,用于高效地存储和检索字符串数据集中的键。 字典树是一种哈希树的变种,其核心思想是利用字符串的公共前缀来减少查询时间,从而最大限度地减少无谓的字符串比较。原创 2024-10-04 12:50:01 · 272 阅读 · 0 评论
分享