如何衡量一个算法的好坏? 复杂度:空间复杂度 + 时间复杂度
事后统计法:就是在算法的程序运行结束后,根据实际运行结果衡量算法好坏
事前估计法:就是在程序运行之前,先按照程序代码,来预估算法的好坏
时间复杂度:用基本指令的运行次数而不是运行时间代表时间复杂度,同一个程序在不同配置的机器下的运行时间不一定相同
时间复杂度:基本语句的执行次数 ,一个关于问题规模N的数学表达式 并不一定要计算精确的执行次数,而是使用 O的渐进表示法,会忽略掉较小的执行次数,表示出一个大概的执行次数
-
用常数1表示所有的加法常数 O(1)
-
只保留最高阶项,
-
如果最高阶项存在且不为1,则去除他的系数,即是大O结果。
-
如O(F(N))=O(3N^2+2N+10) --> 3N^2+2N --> 3N^2 --> O(N^2)
-
主要看最差情况:(底线)任意输入规模最大运行次数
数据结构中如果没有明确说明, Lg N指的是log2 ^N 而不是log10^N
空间复杂度:临时占用空间的大小,要看在空间中定义的变量的多少 看有没有开辟辅助空间
-
辅助空间使用的越多,说明空间复杂度越高
递归:时间复杂度:递归深度 空间复杂度:递归深度*每次递归创调用的变量数
//以斐波那契数列数列为例
long long Fib(int first,int second,int N)
{
return (N<3)?1:Fib(N-1)+Fib(N-1);
}
降低时间复杂度的方法
//伪递归
long long Fib(int first,int second,int N)
{
if(N<3)
return 1;
if(N==3)
return first+second;
return Fib(second,first+second,N-1)
}