随笔分类 - Algorithms Notes
学习算法的笔记
摘要:什么是组合数? 组合数公式是指从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合; 从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做n个不同元素中取出m个元素的组合数。用符号c(n,m) 表示 前置知识:排列公式 排列公式是建立一个模型,从n个不
阅读全文
摘要:高斯消元求解线性方程组,时间复杂度:O(n^3) 通过一系列初等行变换,把增广矩阵转换为最简阶梯型矩阵,并通过回代求出方程的解 适用于求解包含n个方程,n个未知数的多元线性方程 初等行变换: 用一个非零数乘某一行 交换两行的位置 把其中一行的若干倍加到其他行上 对于线性方程组,是由n个n元一次方程组
阅读全文
摘要:裴蜀定理(Bezout定理) 对于任意整数a,b,存在一对整数x,y,满足ax + by = c (充要条件是:gcd(a,b)整除c) 裴蜀定理针对的是两个变量,也可以扩展到多个变量,只需要两两求最大公约数 扩展欧几里得算法 裴蜀定理是按欧几里得算法证明的,同时也给出了整数x,y的计算方法,这种计
阅读全文
摘要:int read(){ char x = getchar(); int ans = 0; for(;x < '0' || x >'9' ; x = getchar()); for(;x >= '0' && x <= '9' ; x = getchar()){ ans *= 10; ans += (x
阅读全文
摘要:欧拉函数 1~N中与N互质的数的个数被称为欧拉函数,记为φ(n) 若a,b的最大公约数为1,那么a,b互质 根据容斥原理,推出计算欧拉函数的式子 设p是N的质因子,1 ~ N中p的倍数有N/p个,同理,若q也是N的质因子,1 ~ N中的q的倍数有N/q个 如果我们把p和q的倍数去掉,那么p*q的倍数
阅读全文
摘要:线段树是什么 线段树(Segment Tree)是一种基于分治思想的二叉树结构,用于在区间上进行信息统计,与按照二进制位(2的次幂)进行区间划分的树状数组相比,线段树是一种更通用的结构: 线段树每一个节点都代表一个区间 线段树具有唯一的根节点,代表的区间是整个统计范围,如[1,N] 线段树的每一个叶
阅读全文
摘要:一般ACM或者笔试题的时间限制是1秒或2秒 在这种情况下,C++代码中的操作次数控制在10的7次方为最佳 在不同数据范围下,代码的时间复杂度和算法该如何选择: 转载于:AcWing
阅读全文
摘要:一、斐波那契 递归 代码虽然简洁、但是低效。时间复杂度为O(2^n) 递归算法时间复杂度计算:子问题个数乘以解决一个子问题需要的时间 int fib(int N) { if (N == 1 || N == 2) return 1; return fib(N - 1) + fib(N - 2); }
阅读全文
摘要:树状数组:是一个数据结构 基本用途:维护序列的前缀和 作用: 快速求前缀和(时间复杂度:O(logn)) 修改某一个数(时间复杂度:O(logn)) lowbit函数 整数在二进制表示下最低位1的位数 int lowbit(int x){ return x & -x; } 建树 //原树状数组 sc
阅读全文
摘要:快速幂,时间复杂度O(logb) 根据数学常识,每个正整数可以唯一表示为若干指数不重复的2的次幂的和 乘积项不多于[log2(b + 1)]个 ll qmi(ll a,ll b){ ll ans = 1 % mod; while(b){ ans = ans * a % mod; a = a * a
阅读全文
摘要:试除法求约数 循环到n/i,存入i与n/i,若i == n/i,则只存一个 #include<iostream> #include<algorithm> #include<vector> using namespace std; int n; vector<int > get_divisors(in
阅读全文
摘要:什么是Trie树 trie,又称前缀树或字典樹,是一种有序树,用于保存关联数组,其中的键通常是字符串。 与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。 一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。 Trie字符串统计 #include<
阅读全文
摘要:字符串匹配问题 一些基本的定义 N, M :字符串的长度 char s[N], p[M]:待匹配串 匹配串 eg: s[N] = “ababa”, p[M] = “aba” 判断 s[N] 中是否有p[M]这个子串,如果有,下标为多少? 解决方法 暴力解决 #include<bits/stdc++.
阅读全文
摘要:一维前缀和 顾名思义:前缀和就是数组前n项和 注意:数组下标从1开始防止越界 1、预处理前缀和数组 2、用公式求区间和 //求前缀和 s[i] = s[i-1]+a[i]; //求数组下标在l,r之间的元素之和 s[r]-s[l-1] 二维前缀和 用二维矩阵来计算 // 求s[i,j] 表示矩阵大小
阅读全文
摘要:数字三角形 给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。 分析: 状态表示f[i,j] 集合:所有从起点走到(i,j)的路径 属性:Max 状态计算 来自左上:f[i-1,j-1]+
阅读全文
摘要:vector 变长数组,倍增的思想 size() 返回元素个数 empty() 返回是否为空 clear() 清空 front()/back() push_back()/pop_back() begin()/end() [] 支持比较运算,按字典序 pair<int,int> first 第一个元素
阅读全文
摘要:并查集 union:将两个集合合并 query:询问两个元素是否在一个集合当中 基本原理:每个集合用一棵树来表示。树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点 问题一:如何判断树根:if(p[x] == x) 问题二:如何求x的集合编号:while(p[x] != x
阅读全文
摘要:单链表 适用于邻接表:存储图和树 //head 表示头结点的下标 // e[i] 表示节点i的值 // ne[i] 表示节点i的next指针是多少 // idx 存储当你已经用到的那个点 int head,e[N],ne[N],idx; //初始化 void init() { head = -1;
阅读全文
摘要:树与图的存储 树是一种特殊的图,与图的存储方式相同。 对于无向图中的边ab,存储两条有向边a->b, b->a。 因此我们可以只考虑有向图的存储。 邻接表: // 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点 int h[N], e[N], ne[N], idx
阅读全文
摘要:初始化的细节问题 我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。 有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背 包装满。一种区别这两种问法的实现方法是在初始化的时候有所不同。 如果是第一种问法,要求恰好装满背包,那么在初始化时除了F[0]为0,其 它F[1.
阅读全文

浙公网安备 33010602011771号