随笔分类 - 基础算法集
萌新福音
摘要:
#单源最短路 ##正权边 ###Dijkstra算法 O(n^2) 每次通过已知最短距离来更新到其他点的最短路 注意出现重边要进行比较 #include<iostream> #include<algorithm> using namespace std; const int N = 1e5+10;
阅读全文

摘要:
##拓扑排序 前提是有向无环图,是图的宽度优先搜索的应用 拓扑序列 若一个由图所有点构成的序列A满足,对于图的每条边(x,y),x在A中的出现,都在y的前面,则称A是这个图的拓扑排序 bool topsort() { int hh = 0, tt = -1; // d[i] 存储点i的入度 for
阅读全文

摘要:
##数组实现最小堆 // h[N]存储堆中的值, h[1]是堆顶,x的左儿子是2x, 右儿子是2x + 1 // ph[k]存储第k个插入的点在堆中的位置 // hp[k]存储堆中下标是k的点是第几个插入的 int h[N], ph[N], hp[N], size; // 交换两个点,及其映射关系
阅读全文

摘要:
##KMP 记忆化搜索,ne用来记录最大前后缀 // s[]是长文本,p[]是模式串,n是s的长度,m是p的长度 #include <iostream> using namespace std; const int N = 1e5 + 10; char s[N], p[N]; int ne[N];
阅读全文

摘要:
##链表 ###单链表 例题 算法题中用数组实现链表,时间费用低 // head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点 int head, e[N], ne[N], idx; // 初始化 void init() { head = -1; idx
阅读全文

摘要:
##双指针 时间复杂度普遍为O(n) for (int i = 0, j = 0; i < n; i ++ ) { while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑 } 例题 #include <iostream> #include <cstring> #
阅读全文

摘要:
##一维前缀和 例题 #include<iostream> using namespace std; const int N = 1e5+10; int n,m; int s[N],num[N]; int main() { cin >> n >> m; for(int i = 1; i <= n;
阅读全文

摘要:
##高精度加法 #include <iostream> #include <vector> #include <cstring> using namespace std; vector<int> add(vector<int> &A, vector<int> &B) { vector<int> C;
阅读全文

摘要:#暴力 依据素数定义,将每个数循环次). #include <stdio.h> int prime(int n) { if (n == 1) return 0; int cnt = 0; for (int i = 2; i
阅读全文
摘要:#介绍 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列. #基本思想 对有序序列进行折半操作,逐渐缩小所要查找的数据范围. 二分查找相比于顺序查找更快速,时间复杂度从O(n)优化到O(logn
阅读全文
摘要:#快速排序 ##基本思想 1. 随机找到一个基准数. 2. 将所有小于他的数放在左边,所有大的数放在右边. 3. 最后重复以上操作,直至各部分左右指针相遇. 如GIF所示,一个无序的数组3 5 8 1 2 9 4 7 6 把右端点作为基准数,然后左指针开始从左扫描,当遇到>=6 的数时停止,此时右指
阅读全文
摘要:#介绍 快速幂是一种计算底数的n次幂的方法,他将朴素的O(n)的时间复杂度缩短到O(logn),计算效率大大提升,减少循环次数,不至于做题超时. #算法核心 他将普通的累乘合并,利用二进制的特性将指数分半,底数平方,循环次数减少. 如:2^5 其指数5为十进制数,二进制为0101,将二进制写为十进制
阅读全文