- 博客(53)
- 收藏
- 关注
原创 trie树(字典树)
字典树(Trie),也称为前缀树或单词查找树,是一种用于存储字符串集合的数据结构,特别适用于处理前缀相关的问题。字典树的基本特点是通过共享公共前缀来节省存储空间,并且可以高效地进行字符串查询操作。
2024-10-01 23:50:15 976
原创 哈希表和字符串哈希算法
哈希表(Hash Table)是一种数据结构,它可以通过一个哈希函数将键(key)映射到存储位置,从而实现高效的数据查找、插入和删除操作。哈希表的特点是能够在常数时间(O(1))内完成查找和更新,前提是哈希冲突处理得当。
2024-09-30 23:19:29 818
原创 KMP算法
BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将主串SS的第一个字符与模式串TT的第一个字符进行匹配,若相等,则继续比较SS的第二个字符和TT的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种暴力算法。我们来看一个例子BF算法我们很明显可以看到会出现很多多余的匹配,因为匹配错误后就要回退到开始的下一个位置,这就导致我们BF算法的时间复杂度为O(m*n)
2024-09-28 09:35:19 642
原创 数组模拟邻接表存图
图(graph)是一种非线性数据结构,由顶点和边组成。我们可以将图 抽象地表示为一组顶点和一组边的集合。G(V,E)图分为有向图和无向图,下图带箭头为有向图,无箭头为无向图我们可以用两种方式来表示图,邻接矩阵和邻接表,我们主要来讲一下邻接表。
2024-09-26 23:38:06 313
原创 前缀和与差分(二维)
下面是一个二维数组,我们要求(1,1)到(2,2)区间内的所有元素的和,最原始的方法就是遍历每个元素然后一个一个加起来,此时时间复杂度为O(n*m)。我们之前学过一维数组的前缀和那么我们可以这样优化一下,此时时间复杂度优化到了O(min{n,m})。还可以在优化吗?答案是可以的。我们依然根据一维数组的前缀和的思想来考虑二维数组在上面的公式中我们发现出现了i-1和j-1,那么我们就需要考虑边界防止i或j为0时造成数组越界,1.当且我们可以得到2.当我们可以得到(一维数组前缀和)
2024-09-21 00:05:48 473
原创 前缀和与差分(一维)
我们着重要记住差分标记我们根据上面的差分标记来试着操作一下我们发现把标记后的差分数组,进行一次前缀和操作,可以得到最终的答案。为什么会这样呢?我们来看一下下图这就是差分标记的由来。那么使用差分后时间复杂度是多少呢,为O(n+m)是一个线性的复杂度。
2024-09-20 00:36:55 437
原创 高精度加法和减法
在C/C++中,我们经常会碰到限定数据范围的情况,我们先来看看常用的int和long long两种数据类型的范围吧。C++标准规定:int占一个机器字长。在32位系统中int占32位,即4个字节,所以int的范围是[-2的31次方,2的31次方-1],为1e8数量级;longlong的范围则是[-2的63次方,2的63次方-1],为1e18数量级。如果超过该数量级,该怎么办?此时就需要用到高精度算法。
2024-09-18 21:44:22 1171
原创 整数二分算法和浮点数二分算法
现实中运用到二分的就是猜数字的游戏 假如有A同学说B同学所说数的大小,B同学要在1~100中间猜中数字65,当B同学每次说的数都是范围的一半时这就算是一个二分查找的过程。
2024-09-17 23:40:04 873
原创 分治算法归并排序
把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题…直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
2024-09-17 14:01:36 310
原创 快速排序算法
每次都取数组的第一个元素作为基准元素,凡是大于这个基准元素的都放在它的右边,凡是小于这个基准元素的都放在它的左边。具体步骤如下:1.设置两个变量i和i(也称为哨兵),令序列第一个元素为基准元素。2.i指向序列的最左边,j指向序列的最右边,j从右往左试探,i从左往右试探,直到j找到小于基准的数就停止,i找到大于基准的数就停止,交换i和j指向的两个数,j继续往左试探,i继续往右试探3.如果i与j相遇,则i或j上的元素与基准元素交换,则这一轮排序结束。对基准元素两边的序列重复以上操作。
2024-09-16 19:33:18 437
原创 拓扑排序算法
上图意思为在我想要完成C7这件事之前我必须先完成事件C1,在完成C5这件事之前我必须先完成事件C6和C3.由图可以提看出拓扑序列是不唯一的。
2024-09-15 20:50:43 963
原创 力扣第560题 和为k的子数组
我们用一个变量 sum 来记录当前元素之前所有元素的累加和,也就是前缀和。前缀和可以帮助我们快速计算某一段子数组的和。
2024-09-13 20:01:20 631
原创 动态规划01背包问题
现有四个物品,小偷的背包总容量为8,怎么可以偷到价值最多的物品(注意:每件物品最多只有一件)如:物品编号:1 2 3 4物品重量:2 3 4 5物品价值:3 4 5 8。
2024-09-12 10:02:24 352
原创 数据结构与算法图论 并查集
原题目:现在有若干家族图谱关系,给出了一些亲戚关系,如Marrv和Tom是亲戚,Tom和Ben是亲戚等等。从这些信息中,你可以推导出Marry和Ben是亲戚。请写一个程序,对于我们的关于亲戚关系的提问,以最快速度给出答案。
2024-09-11 21:09:36 918
原创 怎么筛出来素数
int prime[N]:用于存储找到的质数。int cnt:质数的计数器,初始值为 0。bool st[N]:布尔数组,表示每个数是否为非质数(true 表示非质数,false 表示质数)。int sum[N]:备用数组,在此函数中并未使用。埃拉托斯特尼筛法具有 𝑂(𝑛loglog𝑛) 的时间复杂度,是找出所有小于等于 n 的质数的经典算法。
2024-09-03 23:52:46 399
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人