![](https://img-blog.csdnimg.cn/20190927151132530.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法基础
文章平均质量分 91
讲解一些基础算法,实现算法入门
sunluyang521
这个作者很懒,什么都没留下…
展开
-
算法基础3.3最小生成树:普利姆算法(朴素和堆优化版Prim),克鲁斯卡尔算法(Kruskal),二分图(染色法,匈牙利算法)
最小生成树由于没有环,正边和负边都可以实现,Prim与Dijkstra算法实现的方法差不多,堆优化版的与克鲁斯卡尔算法有竞争关系,因为克鲁斯卡尔算法思路更简单且代码实现方便被较多使用,稠密图用朴素的Prim,稀疏图用Kruskal算法。一定秉承实用主义。原创 2024-03-23 21:01:22 · 920 阅读 · 1 评论 -
算法基础4.1数学——质数,约数
/质因子primes[j]<primes[j+1],此时的primes[j+1]不是primes[j+1]*i的最小质因子,此时就应该。//2)当有i%primes[j]==0时,说明i的最小质因子是primes[j],因此primes[j]*i的最小质因子也就应该是。i ++ )//i <= x / i:防止越界,速度大于 i < sqrt(x)i % primes[j] == 0:primes[j]一定是i的最小质因子,primes[j]一定是primes[j] * i的最小质因子。原创 2024-03-25 20:58:22 · 1033 阅读 · 1 评论 -
算法基础4.4容斥原理,简单博弈论
/选中奇数个集合, 则系数应该是1, n/t为当前这种状态的集合数量。//因为取石子数目的集合是已经确定了的,所以每个数的sg值也都是确定的,如果存储过了,直接返回即可。//s存储的是可供选择的集合,f存储的是所有可能出现过的情况的sg值。//set代表的是有序集合(注:因为在函数内部定义,所以下一次递归中的S不与本次相同)//枚举从1 到 1111...(m个1)的每一个集合状态, (至少选中一个集合)//乘积大于n, 则n/t = 0, 跳出这轮循环。原创 2024-03-29 23:02:31 · 764 阅读 · 0 评论 -
算法基础3.2最短路算法:Dijkstra(朴素和堆优化迪杰斯拉),bellman-ford(贝尔曼ford算法),spfa(优化的贝尔曼),Floyd(多源汇)
常见的最短路问题,一般来说可以分成两大类,第一大类是单源最短路问题,第二大类就是多源汇最短路。单源最短路,一般来说是求从一个点到其他所有点的最短距离,比方说最常见的一种题型是从一号点到n号点的一个最短路径,就是求出来从从一号点到其他所有点的最短路之后,那么从一号点到n号点的最短路也就求出来了,多源汇最短路,源点就是起点,一般来说在图论里边,源点就是起点。汇点一般来说就是终点。原创 2024-03-09 20:58:14 · 768 阅读 · 1 评论 -
算法基础2.1链表与邻接表,栈与队列,KMP
C++ STL简介vector, 变长数组,倍增的思想size() 返回元素个数empty() 返回是否为空clear() 清空[]支持比较运算,按字典序first, 第一个元素second, 第二个元素支持比较运算,以first为第一关键字,以second为第二关键字(字典序)string,字符串size()/length() 返回字符串长度empty()clear()substr(起始下标,(子串长度)) 返回子串。原创 2024-02-28 17:53:03 · 769 阅读 · 0 评论 -
算法基础1.3:双指针,位运算,离散化,区间合并
双指针for (int i = 0, j = 0; i < n; i ++ ){ while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑}常见问题分类: (1) 对于一个序列,用两个指针维护一段区间 (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作双指针算法是用的非常多的一种算法,比方说归并排序中有一步是要把两个有序序列合并,两个指针分别指向两个序列的开头,每一次分别移动原创 2024-02-15 14:12:09 · 1886 阅读 · 1 评论 -
算法基础2.2Trie树(字典树),并查集,堆
首先是有一个根结点root,然后先把第一个单词存进来,存的时候从前往后依次遍历每一个字符,当前的单词是abcdef,然后首先从根结点开始,看一下根结点有没有a这个点作为子节点,然后没有的话,就把a节点创建出来,以此类推,下一个字母是b,c,d,e,f.然后来看第二个单词abdef,还是一样的道理,从根结点开始,首先看有没有a这个字母,有a走到a,然后看b,有b走到b,然后下一个是d,没有d的话创建一个,下一个是e,d是没有e的,再把e创建出来,下一个是f。原创 2024-02-29 20:27:13 · 682 阅读 · 0 评论 -
算法基础4.3高斯消元,求组合数
j -- )// 从后往前,当前行的每个数字,都减去对应列 * 行首非0的数字,这样就能保证第一个数字是 a[i][0] -= 1*a[i][0];i < n + 1;if (fabs(a[i][n]) > eps)// a[i][n] 代表 b_i ,即 左边=0,右边=b_i,0!//进而进行整行row[i]^row[j] 间接导致 a[i][n]^a[j][n]//如果不是0 才需要用第j行第j列a[j][j]来^第i行第j列a[i][j]原创 2024-03-29 22:41:25 · 569 阅读 · 1 评论 -
算法基础1.1:排序(快排,归并)与二分(整数,浮点数)
主要思想是基于分治,为了把一组无序的数有序排列,假设存放一组数的数组为q,最左和最右的数分别为l和r1.确定分界点x:q[l], q[(l+r)/2], q[r] 或 随机(不一定等于x)2.调整区间(最重要,最难):根据x的值把整个区间划分为两部分(长度不一定相等),使得左边第一个区间里的数都小于等于x,右边第二个区间里的数都大于等于x,3.递归处理左右两段分别排好序,拼接在一起(左边最大值小于等于右边最小值)对于第二步:第一种方法(暴力,开辟空间,时间复杂度线性,On)原创 2024-02-12 18:09:13 · 795 阅读 · 1 评论 -
算法基础2.3哈希表,C++STL容器常用用法
哈希表哈希表的主要内容是两大块。第一大块是哈希表的存储结构,第二大块是介绍一个常用的字符串哈希的方式。哈希表的存储结构一般来说分成两大类,第一大类是开放寻址法,第二大类是拉链法。哈希表最主要的作用是把一个比较庞大的一个空间或者是一个值域,把它映射到一个比较小的空间,一般情况下映射到从零到n,n一般来说可能是十的五次方或十的六次方这种级别。例题:维护一个集合,支持如下几种操作:I x,插入一个整数x; Q x,询问整数x是否在集合中出现过;现在要进行N次操作,对于每个询问原创 2024-03-02 12:06:32 · 696 阅读 · 0 评论 -
算法基础4.2欧拉函数,快速幂,扩展欧几里得算法,中国剩余定理
1∼N中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。若在算数基本定理中,N=p1a1p2a2…pmam,则:第(3)步后还要继续处理四个数相乘的倍数,然后再处理五个数,以此类推。最后就可以发现欧拉函数的公式展开后和上面用容斥原理求出的式子是相同的若N=p1α1p2α2…pkαk,则有ϕ(N)=N(1−1/p1)(1−1/p2)…(1−1/pk)。如:N=6=2∗3,则ϕ(N)=6∗(1−1/2)(1−1/3)=2。证明:容斥原理。原创 2024-03-29 10:44:58 · 739 阅读 · 1 评论 -
算法基础1.2:高精度,前缀和,差分
高精度运算:只有C++需要高精度的学习,JAVA和python则不需要,因为JAVA是大整数类,没有位数要求,python默认数的范围就是无限大,只有C++没有大整数类。高精度主要服务于比较大的整数加减乘除,一般来说高精度考四种。第一种的话是两个比较大的整数相加(a和b的位数大概是10的六次方)。第二种是两个比较大的整数相减(a和b的位数大概是10的六次方)。第三种是一个大整数乘上一个小的整数。(大整数的长度小于10的6次方,小的整数小于等于10的9次方,是特别长的一个数。第四种是a原创 2024-02-14 15:42:22 · 1869 阅读 · 1 评论 -
算法基础3.1深度优先搜索(DFS),宽度优先搜索(BFS),树与图的存储,树与图的深度优先遍历,树与图的宽度优先遍历,拓扑排序
深搜dfs和宽搜bfs都可以对整个问题空间进行搜索,搜索的这个结构都是像一棵树一样,但是搜索的顺序是不一样的,深度优先搜索的话会尽可能往深了搜,当搜到叶结点的时候就会回溯,dfs可以看成是一个非常执着的人,他不管往哪条路走,一定会走到头,走不到头的时候是不可能回来的。一旦走到头了,注意回去的时候也不是说直接回到头,而是边回去边看能不能继续往前走。只有确定当前这个点所有的路都走不了的时候,才会往回退一步。原创 2024-03-09 07:03:02 · 908 阅读 · 1 评论