09 2021 档案
摘要:分治法的基本思想是将将一个问题分解成若干个规模更小的子问题,然后依据子问题的解得到原问题的解 这个需要递归解决问题,递归解决的子问题一定要与原问题的结构形式保持一直,如果不能一致,需要变成一致 递归函数传递的参数不能是常数 归并算法和快排都是分治 两个n位数的乘积也能分治,将两个n位数从中间分开,高
阅读全文
摘要:讨论基于比较的排序算法 排序算法如果依赖比较,时间复杂度做的不会比nlogn更好,我们可以依据比较的过程画一棵决策树,每进行一次比较都会有两种结果(事先不知道数的大小),将这次结果设为根节点,往下引入两个叶子结点,把未分出大小的接着比较,比较到最后会有n!种结果,因为有n!种排列。而通往每个结果的路
阅读全文
摘要:T(n)=T(n-1)+T(n-2),这个是斐波那契的定义,也说明了计算的方法,在数据不大的情况下,求斐波那契的第n项时间复杂度是O(n),但当n很大时,两个n位数的加法也需要O(n),这样会将时间复杂度升到O(n^2),这个能不能用其他方法降低复杂度,用乘法加速加法,用乘法表示加法 两个n位数相乘
阅读全文
摘要:树状数组是一种特殊的结构,并不是完全的树,而是与一个数组长度相等的另一个数组 设原数组为A[],树状数组为C[] C数组里的元素是A数组若干个元素之和,而求和是有一定规律 用树状数组求和是logN的效率 #include<cstdio> #include<algorithm> #include<io
阅读全文
摘要:将若干对象划分为不相交的集合,在每个集合中选择某个元素代表所在集合 可以用编号最小的元素标记,也可以开辟一个数组a[],a[i]代表元素i所在的集合 并查集常见的运算有merge find 数组操作find是O(1)时间,merge是O(n)时间 树状结构,fa[i]代表i的父节点,判断元素是否位于
阅读全文
摘要:vector函数使用需要头文件vector 一、初始化: vector a(10)先给10个空间,不定义也是合法的 vector a(10,1) 10个空间初始化为1 vector a(b) 用向量b拷贝一个向量a vector a(初指针,末指针) 二、重要函数 a.push_back(item)
阅读全文
摘要:检验一个数是否是素数,朴素的方法有试除法,筛法,因为费马小定理和模的运算,可以将时间复杂度降为klogN,k是常数,k越大,算法返回结果正确的概率越高 费马小定理 a^(p-1)≡1 (mod p)(a不是p的倍数) 费马小定理的逆定理不一定成立,即可能是合数也返回了1,这样的数称为伪素数,但a不同
阅读全文
摘要:辗转相除法/欧几里得算法求两个数的最大公约数,gcd(m,n)=gcd(n,m%n) 这个算法的效率非常高,是对数级别的时间复杂度 当m>=2n时,m->n,规模至少变成了原来的1/2,当m<2n,虽然这次规模不会变成一半,但下次规模会变成一半,若仍不会变成一半,不难证明上次规模至少变成了2/3,整
阅读全文
摘要:在计算机做n位二进制乘法时,每一位与n位相乘,乘以n次,时间复杂度是n^2 现在采取一种办法:每次把被乘数除以2,乘数乘以2,最后肯定被乘数变为1或者是0,但结果可能偏小,因为被乘数会因为是奇数不能被2整除而丢失一部分 x/2=(x-1)/2 x/2 * y * 2->(x-1)/2 * y * 2
阅读全文

浙公网安备 33010602011771号