算法
常用算法积累
胡小涛
头发头发饶过我吧!
展开
-
前向星和链式前向星(详解+模板)
前向星和链式前向星参考博客:深度理解链式前向星什么是前向星前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了。用len[i]来记录所有以i为起点的边在数组中的存储长度。用head[i]记录以i为边集在数组中的第一个存储位置。样例:其中边的输入顺序:1 22 33 41 34 11 54 5我们对其中的边按照定义排序完后:编号:原创 2020-06-10 20:31:08 · 927 阅读 · 0 评论 -
动态规划专题详细总结(常见简单类型)
动态规划专题(常见简单类型)什么是动态规划动态规划(Dynamic Programming, DP)是一种用来解决一类最优化问题的算法思想。简单来说,动态规划将一个复杂的问题分解为若干个子问题,通过综合子问题的最优解来得到原问题的最优解。需要注意的是,动态规划会将每个求解过的子问题的解记录下来,这样当下一次碰到同样的子问题时,就可以直接使用之前记录的结果,而不是重复计算。注意:虽然动态规划采用这种方式来提高计算效率,但不能说这种做法就是动态规划的核心。一般可以使用递归或者递推的写法来实现动态规划,其中原创 2020-06-09 10:34:44 · 1082 阅读 · 0 评论 -
扩展欧几里得算法(详细推导+代码实现+应用)
1.扩展欧几里得算法贝祖定理:若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by=m中的m一定是d的倍数。(特别地,如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。)那么贝祖定理的一个直接应用就是:如果ax+by=1有解,那么gcd(a,b)=1(将原公式两边同时除以gcd(a,b))。扩展欧几里得算法用来解决这样一个问题:给定两个非零的整...原创 2020-04-07 20:05:16 · 10130 阅读 · 8 评论 -
大数的运算(详细思路+代码)
大整数的存储我们可以定义一个结构体来存储:struct bigNum{ int d[1000]; //存储大整数 int len; //大整数的长度 bigNum() { memset(d, 0, sizeof(d)); len = 0; }};在我们输入大数时,一般先用字符串读入,然后再把字符串另存...原创 2020-03-15 18:28:16 · 3540 阅读 · 1 评论 -
埃氏筛、欧拉筛
前言对于1~n范围内素数的查找,我们常用的二重循环暴力算法的复杂度是O(n2),如果利用开根缩小范围的时间复杂度也无非是在O(nnn\sqrt nnn),而,这些算法对于n在105以内都是可以接受的,但是如果需要更大范围的素数表,这些算法将显得力不从心。下面将介绍更加高效的算法。埃氏筛埃氏筛也叫素数筛法,其关键在一个“筛”字。算法从小到大枚举所有数,对于每一个素数,筛去它的所有倍数,剩下的...原创 2020-03-14 11:07:10 · 520 阅读 · 0 评论 -
最大公约数和最小公倍数
最大公约数假设用gcd(a,b)来表示a和b的最大公约数。首先认识一个定理:假设a、b均为正整数,则gcd(a, b) =gcd(b, a%b)。证明:设a = kb + r,其中k和r分别为a除以b得到的商和余数。则有r = a - kb成立。设d为a和b的一个公约数,那么由r = a - kb,得d也是r的一个约数。因此d是b和r的一个公约数。又由r = a%b,得d为b...原创 2020-03-13 15:39:04 · 525 阅读 · 0 评论 -
快速幂、矩阵快速幂(原理+模板)
快速幂首先,快速幂是用来解决什么问题的?给定三个正整数a、b、m(a<109,b<1018,1<m<109),求ab%m对于这个问题,如果使用暴力来处理显然是不行的,O(b)的复杂度支持b<108都已经很艰难了,更何况1018快速幂的做法是基于二分的思想,因此也常称为二分幂。快速幂基于一下事实:如果b是奇数,那么有ab = a*ab-1如果b是偶数,...原创 2020-03-10 22:16:11 · 394 阅读 · 0 评论