时空复杂度分析

上来就是一波引用博客ycx yyds
然后偶然发现另一篇哈哈哈对y总补充
然后就该我来写一点补充了,禁止套娃
C++一秒算 1 0 7 10^7 107 ~ 1 0 8 10^8 108次,一千万到一亿次
如果超过了 1 0 8 10^8 108常数还不是特别小的话,一定会超时

这里的数据范围都是左右,比如Floyd 200 也照样用,可以认为是不仅仅 n 3 n^3 n3还有 n 3 n^3 n3logn
平衡树常数很大(每一次循环操作很多),二分常数就比较小(每一次循环操作都很少)
一般来说代码越短常数越小,比如排序
树状数组的常数,比线段树要小了很多
如果想让 我们筛出来 1 0 7 10^7 107以内的所有素数一定要用线性筛去做

n \sqrt[]{n} n 的复杂度的有:试除法求质数,试除法求所有约束,试除法分解质因数,
logn 有欧几里得算法, 快速幂

分析代码的复杂度:

1.最简单的,看它的循环,有重循环就是有多少次方

2.对于递归,可以看主定理,但是不常用。一般只看简单的几种如:快排一共logn层,每层O(n),所以就是nlogn,这是递归最常用的一种方式,算一大类吧,

3.双指针算法:看着俩循环,但是内层循环的j只加不减,也就是内层那个循环体,一共最多执行n次,所以就是O(n)的

4.单链表,(自己写的那种),添加或者删除一个元素都是O(1)的复杂度,栈和队列也是O(1),单调栈,每个元素最多进栈和出栈一次,最多n次,所以是O(n),单调队列相同,KMP:i每次加1,j最多也是+1,而且j > ne[j],内层循环每次还都j-1,所以那个while()循环最多也就是执行n次;trie就是线性的,并查集记住由于find有路径压缩,就变成了nlogn,如果路径压缩和按秩合并都有的话,就变成了nloglogn,如果只有 路径压缩,其实也比nlogn小很多,最坏是nlogn
堆:获得最值O(1),加入或者删除一个元素,要用到up和down操作最坏是O(logn)(与树的深度有关,堆是完全二叉树,所以logn)

5搜索题:就看它的计算量,也就是函数执行多少次.。先画出来一个搜索树,然后看一下每一层的计算量,比如全排列,最后还要输出,是O(n)然后每一次都是点数的阶乘,但是由于对于最下面那一层,其他层都是无穷小量,所以直接O(n*n!)
6.图的遍历要遍历所有的点,图中还遍历了所有的边,也就是O(n+m)拓扑是基于遍历,所以一样
朴素的dij是两个循环,堆优化的,内循环总共就是插入m次,有个堆,也就是mlogm
匈牙利理论是循环一遍点,每个点循环一遍边,也就是nm,但是实际上很快

spfa,二分图的匈牙利,最大流,这三个算法理论复杂度很高,但是实际运行起来还是很好的,非常快、
spfa判负环就不行,它是真的nm
时空复杂度分析_第1张图片会大一点
比如log1e18 = 64左右

6.埃式筛n*调和级数,也就是logn多点,再去掉非质数的情况的话,就变成了,nloglogn
辗转相除法,常数比较小的logn,快速幂,位运算,有多少位算多少次logn

请添加图片描述

树型dp:上司的舞会那个题,dfs中不会重复遍历点,每个点就遍历一遍,然后遍历了每个点的边,所以就是遍历了全部的边,总共就是O(m)

8.贪心一般就是排序+循环

空间复杂度

时空复杂度分析_第2张图片

请添加图片描述
但是要注意,其他地方也要内存,你不能全用来开数组,如果给64M,最多用到50多M就差不多了
注意,网速的8M指的是8M * 1bit 不是8MB,

sizeof 函数能返回你开了多少B,
请添加图片描述
可以这样用电脑算,开了多少M,按照操作系统的优化,如果你开了过大并没有用到这么大,其实也没啥,如果你开了还用了,就不行了
递归也需要空间,一般递归多少层,需要空间就是多少,

你可能感兴趣的:(算法,算法)