自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 ST表(Segment Tree)

ST表是一种基于树形结构的数据结构,用于处理区间查询和更新操作。它通过预处理的方式将原始数据存储在树状结构中,以支持高效的区间查询。ST表的构建时间复杂度为O(nlogn),其中n为原始数据的长度。但一旦构建完成,可以在O(logn)的时间内进行区间查询和更新操作。

2024-04-05 23:05:48 789

原创 树状数组及应用

如果数列A是静态不变的,那么处理前缀和复杂度为O(n),查询为O(1),但如果序列是动态变化的,如改变其中一个元素,那么就需要重新计算前缀和,如果每次查询都有变化,那么复杂度会大幅度增加。有两种数据结构可以高效的处理这个问题:树状数组与线段树。

2024-03-27 16:03:27 1079

原创 有向无环图与拓扑排序

在一个DAG(有向无环图)中,我们将图中的顶点以线性方式进行排序,使得对于任何的顶点 u 到 v 的有向边 (u, v) ,都可以有 u 在 v 的前面。给定一个 DAG,如果从 u 到 v 有边,则认为 v 依赖于 u。如果 u 到 v 有路径(u 可达 v),则称 v 间接依赖于 u。拓扑排序的目标是将所有节点排序,使得排在前面的节点不能依赖于排在后面的节点。

2024-03-17 16:43:27 4000

原创 搜索:DFS与BFS

DFS与BFS为图论中的概念。在搜索算法中,该词常常指利用递归函数方便地实现暴力枚举的算法,与图论中的 DFS 算法有一定相似之处,但并不完全相同。BFS 在搜索中,将每个状态对应为图中的一个点即可。

2024-03-15 16:02:12 301

原创 图论:DFS与BFS

DFS全称是,中文名是深度优先搜索,是一种用于遍历或搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。广义上的DFS:DFS最显著的特征在于其递归调用自身。DFS 会对其访问过的点打上访问标记,在遍历图时跳过已打过标记的点,以确保每个点仅访问一次。

2024-03-15 15:26:35 1554 1

原创 图及图的存储

在图论中,有一些核心概念和基本术语,这些概念对于理解和处理图结构非常重要。以下是一些常见的图论概念梳理:有向图:无向图:1.:图是由点集合及连接这些点的边集合组成的数学结构。图的点通常称为“顶点”(vertices),而连接顶点的线或弧称为“边”(edges)。2.:简单图是没有重复边和重复顶点的图。也就是说,在简单图中,任何两个不同的顶点之间最多只有一条边,并且不存在顶点到边,除了自环。完全图是一种简单图,其中任意两个不同的顶点之间都有一条边。3.自环是指顶点自身相连的边。

2024-03-11 19:00:04 783 1

原创 并查集(Disjoint Set)

并查集,也称为不相交集合数据结构,是一种用于管理元素分组以及查找元素所属组的数据结构。在并查集中,每个集合通常用一棵树来表示,其中树的根节点代表集合的代表元素。通过查找操作可以找到元素所属的集合,而通过合并操作可以将两个集合合并为一个集合。合并(Union):合并两个元素所属集合(合并对应的树)查询(Find):查询某个元素所属集合(查询对应的树的根节点),这可以用于判断两个元素是否属于同一集合并查集在经过修改后可以支持单个元素的删除、移动;使用动态开点线段树还可以实现可持久化并查集。注意。

2024-03-02 16:02:04 1709

原创 哈希表(Hash Table)

哈希表(Hash Table)是一种常见的数据结构,用于实现键值对的存储和快速查找。它通过将键映射到表中的一个位置来实现高效的查找操作。在哈希表中,每个键值对都会经过哈希函数的处理,得到一个哈希值,然后根据哈希值确定该键值对在表中的存储位置。这样可以实现在接近常数时间复杂度内进行插入、删除和查找操作。哈希表可以在平均情况下实现接近常数时间复杂度的查找操作,因为通过哈希函数可以直接定位到存储位置。插入和删除操作也可以在平均情况下实现接近常数时间复杂度,因为哈希表的设计允许快速定位到要操作的位置。

2024-03-02 14:19:08 882

原创 分治法(Divide and Conquer)

分治法(Divide and Conquer)是一种解决问题的算法设计策略,它将一个大问题分解成若干个规模较小且结构与原问题相似的子问题,然后递归地解决这些子问题,最后将子问题的解合并起来得到原问题的解。:将原问题分解成若干个规模较小的子问题,这些子问题与原问题的结构相同,并且可以相互独立地解决。:递归地解决这些子问题。如果子问题的规模足够小,可以直接求解而不再进行分解。:将子问题的解合并起来,得到原问题的解。

2024-03-02 13:50:00 545

原创 哈夫曼树与哈夫曼编译码

哈夫曼树(Huffman Tree)是一种特殊的二叉树,通常用于数据压缩中的哈夫曼编码(Huffman Coding)。哈夫曼树是一种带权路径长度最短的树,其中树中的叶子节点代表要编码的字符,而非叶子节点不包含任何数据。哈夫曼树的特点是,权重较大的节点离根节点较近,权重较小的节点离根节点较远,从而保证了整棵树的带权路径长度最短。哈夫曼树在数据压缩中被广泛应用,利用字符出现的频率来构建哈夫曼树,生成不等长的编码,实现高效的数据压缩。

2024-02-23 00:03:48 1612 3

原创 树与二叉树

树是一种层次性的数据结构,它由节点(或顶点)和连接这些节点的边组成。树中有一个特殊的节点称为根节点,它位于树的顶部,没有父节点。树中的每个节点可以有零个或多个子节点,子节点之间通过边连接。树中除了根节点外的每个节点都有且仅有一个父节点。:树的顶部节点,没有父节点。:一个节点的直接上级节点称为其父节点。:一个节点的直接下级节点称为其子节点。:没有子节点的节点称为叶子节点或叶节点。:除了叶子节点之外的节点称为内部节点。:从一个节点到另一个节点的边的序列称为路径。

2024-02-23 00:03:12 916

原创 高精度计算

在进行计算的过程中,会遇到几十位,甚至几百位的数字的计算问题,也有可能会遇到小数点后几十位的情况,而我们面对这样的情况下,intlongdouble等类型的取值范围不足的问题,高精度计算可以解决此类问题。高精度主要是用在C/C++,Python 是默认无限大的,所以不需要用高精度,JAVA是有库可以调用也是不需要用高精度。高精度计算本质上是用字符串模拟数字进行计算,再利用类似于数学里的竖式的形式,一位一位进行相关计算 .

2024-02-22 21:36:33 1054 1

原创 模运算(modulus operation)

两个大数a,b做乘法取模时,直接用(a * b) mod m = ((a mod m) * (b mod m)) mod m可能出错,因为a*b可能溢出,(a mod m) * (b mod m)也可能溢出。C++、C和java:5%3输出2,(-5)%(-3)输出-2,(-5)%3输出-2,5%(-3)输出2。Python:5%3输出2,(-5)%(-3)输出-2,(-5)%3输出1,5%(-3)输出-1。为了不直接计算a*b,改为计算(a*2)*(b/2),其中a*2不会溢出,b/2不会溢出。

2024-02-22 02:11:17 1960 1

原创 幂运算与快速幂

幂运算是数学中的一个基本运算,用于表示一个数的指数次幂。它将一个数(称为底数)乘以自身多次,次数由另一个数(称为指数)指定。幂运算的一般形式为:其中,a是底数,n是指数。底数表示要进行幂运算的数,指数表示底数要乘以自身的次数。幂运算的结果为底数的指数次幂。例如,2的3次幂可以表示为2^3,计算结果为8。这意味着2乘以自身3次,即2 * 2 * 2 = 8。幂运算在数学和计算机科学中广泛应用,例如在代数、几何、物理学、计算机图形学等领域中。

2024-02-22 00:23:58 1450 1

原创 素数与素数筛

由于费马小定理的逆定理并不正确,对于卡迈克尔数即满足费马小定理的逆定理但是不为素数的数,虽然卡迈克尔数很少,在1~100000000范围内的整数中,只有255个卡迈克尔数,但是已经使他的效果落后于Miller-Rabin和Solovay-Strassen素性检验。欧拉筛(Euler's Sieve),也称为改进的埃拉托斯特尼筛法(埃式筛),是一种优化过的素数筛法,用于找出一定范围内的所有素数。例如i=5,2*5,3*5,4*5已经在前面i=2,3,4,5的时候筛选过了。第1个检查的是2,他说第一个素数;

2024-02-21 23:20:46 1314

原创 单调栈、单调队列和优先队列

栈(Stack)是一种具有特定行为的数据结构,遵循"后进先出"(Last-In-First-Out,LIFO)的原则。栈可以被看作是一种容器,其中元素的插入和删除操作仅限于栈顶(top)位置。栈的实现可以使用数组或链表等数据结构,C++中有STL容器可以实现栈。在使用数组实现时,需要注意栈的大小限制,即栈的最大容量。当栈的大小达到最大容量时,继续入栈会导致栈上溢(Stack Overflow)。栈常用于需要按照特定顺序处理元素的场景,例如函数调用栈、表达式求值、括号匹配等。

2024-02-17 21:46:02 1151 2

原创 动态规划入门(DP)

动态规划(Dynamic Programming,DP)是算法竞赛的必考题型,内容多变。

2024-02-16 01:49:17 3037 3

原创 贪心与拟阵

拟阵由两个基本组成部分构成:基础集合(ground set)和独立集合(independent set)。基础集合是拟阵的元素集合,而独立集合是基础集合的子集,满足一定的性质。在拟阵中,独立集合被认为是不包含冗余元素的集合,类似于线性代数中的线性无关集合。一个拟阵是满足以下条件的序对M=(S,L):1.S是一个有穷集合;(例如:S={1,2,3,4})2.L是S的一个非空子集族,L中的元素称为拟阵的独立集;

2024-02-02 20:36:30 1015

原创 GCD与LCM

整数a和b的最大公约数是指能同时被a和b整除的最大整数,记为gcd(a,b)。例如,gcd(15,81)=3。注意:由于-a的因子与a的因子相同,因此gcd(a,b)=gcd(|a|,|b|)。编码只需关注正整数的最大公约数。整数a和b的最小公倍数表示为为lcm(a,b)。例如,lcm(5,6)=30。

2024-01-31 20:14:20 2648

原创 模拟、思维、构造与博弈

在自然界中,许多现象具有不确定的性质,有些问题甚至很难建立数学模型,或者很难用计算机建立递推、递归、枚举、回溯法等算法。在这种情况下,一般采用模拟策略。而模拟策略也就是模拟某个过程,通过改变数学模型的各种参数,进而观察变更这些参数所引起过程状态的变化,由此展开算法设计。通俗来说就是按照题目的要求,一步步写出代码。

2024-01-25 23:58:34 1177

原创 C++二分法

把区间[a,b]分成n等分,每个子区间长度为x,及算点xi=a+i*x(i=0,1,2,3...)的函数值f(xi),若函数值为0,则为一个实数根,若满足f(xi)*f(xi+1)

2024-01-24 13:22:43 2587

原创 算法中的数

一个用作计数、标记或用作量度的抽象概念。代表数的一系列符号,包括数字、运算符号等统称为记数系统。在日常生活中,数通常出现在标记、序列号等上。在数学里,数的定义延伸至包含如分数、负数、无理数及复数等抽象化的概念。C++中的数值类型intshortlonglong longintshortlonglong longfloatdouble。

2024-01-21 16:28:26 986

原创 前缀和与差分

它可以将一些原本需要对整个区间进行更新的操作转化为对差分数组中的两个元素进行更新,从而减少了更新的时间复杂度。开始,a[0][j]=a[i][0]=sum[0][j]=sum[i][0]=0。二维数组a[n][m],二维前缀和sum[n][m],首项均从。求数组a[n][m]在(x1,y1)到(x2,y2)之间的和。一维数组a[n],前缀和sum[n],首项均从。一维数组a[n],差分diff[n],首项均从。开始,a[0]=diff[0]=0。开始,a[0]=sum[0]=0。4.1.1.简单应用。

2024-01-18 15:11:35 988 2

原创 算法中的C++入门及STL

​​​​​​​。

2024-01-16 02:02:54 1027 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除