一,时空复杂度
(一)时间复杂度
1,衡量算法执行时间随输入规模增长的增长率,通过分析基本操作的执行次数来确定
2,常见包含:常数时间O(1) 就是说时间长短不随输入规模而改变;线性时间O(n) 我的理解就是类似线性函数;对数时间O(log n) ;平方时间O(n^2)等。
3,在计算时关心的只有复杂度的数量级,并不严格要求表达式。
也就是说假如有两个并列的for循环,他们的时间复杂度都是o(1),执行1~n,
则时间复杂度为o(2n)相当于o(n),前面那个常数不看
4,一般来说,评测机1秒大约可以跑2e8次(2*10^8)运算,那么就要尽可能地让我们的程序运算规模数量级控制在1e8以内。
(二)空间复杂度
大体类似时间复杂度,是衡量算法执行过程中所需的存储空间随输入规模增长的增长率
通过分析算法中所使用的额外存储空间的大小来确定的
一般来说题目不会卡空间只会卡时间
(三)分析技巧
1,基本操作:比如算术操作(加法,减法,位运算等),比较操作,赋值等,这种一般是o(1)
2,关注循环结构:一般一个for()是o(n),里面嵌套一个是o(n^2)
3,递归算法:比较复杂,确定递归的深度以及每个递归调用的时间和空间开销;一般是画递归树来分析;
有个小结论:一个二叉树,n层,节点数(执行递归调用的次数)为2^n个,实际还应该在此基础上减一,但是估算就忽略了
4,善用一些已经知道的常见算法的结果来分析
二,枚举
(一)枚举算法介绍
1,简单来说就是穷举所有可能,基本思想是:将问题的解空间中的每个可能的解都枚举出来,并进行验证和比较,最后找到解
2,只能由于规模小,解空间可以穷举的情况
(二)解空间的类型
1,一个范围内的所有数字(或者二元组,字符串等数据),或者满足某个条件的所有数字
举个例子:找n的所有偶数因子,想法如下:
(1)先找到n的所有因子,再从中筛选出偶数;那么其解空间就是n的所有因子
(2)先找出所有偶数,在看是否是n的因子;那么解空间就是所有的偶数
2,也可是解空间树,一般分为子集树和排列树,需要使用回溯法来枚举
(三)循环枚举解空间
1,首先确定维度,就是需要枚举的变量个数
比如说要一个数字,那就是一个循环去枚举;如果是一个二元组,那就要双重循环分别枚举第一个和第二个变量
2,对于每个变量,确定其可能的取值范围,这一步是时间复杂度优化的关键
举例:找n的所有偶数因子,那么确定的取值范围肯定是n的因子,就不要往所有的偶数上去想
3,再循环体内,对每个可能解进行处理,变成真正的解
三,模拟
(一)模拟算法介绍
1,通过模拟实际情况来解决问题,一般容易理解但比较复杂
2,有较多的简单但不好处理的部份组成,会写比较多的小函数来帮助解题
3,解法比较暴力,一般不会卡时间复杂度
309

被折叠的 条评论
为什么被折叠?



