时间复杂度:
1.常数——o(1);一个常量运行特定的次数
o(1)表示该算法的执行时间,不论输入输出的数据大小,只要没有循环等复杂结构那他o(1);
2.线性——o(n);一个变量运行次数=N或n*一个数;
o(n)表示一个算法的性能会随这输入数据大小发生变化,for里代码会执行n变,所以它是随n变化的,可以用o(n);
for(int i=0;i<n;i++){cout<<"1";}
3.平方——o(n^2);一个变量运行次数=N的N次方;(嵌套)
最常见的就是对输入数据进行嵌套循环。如果嵌套层级不断深入的话,
算法的性能将会变为立方阶 三次:O(n^3)$,四次:o(n^4) k次:o(n^k);
for(x=1;i<=n;x++){for(i=1;i<=n;i++){cout<<"1";}
4.指数——o(2^n);一个变量运行次数=2的N次方;
指数阶$O(2^n)$ 【斐波那契数列 暴力递归函数】
$O(2^n)$,表示一个算法的性能会随着输入数据的每次增加而增大两倍,
典型的方法就是裴波那契数列的递归计算实现
递归函数 中递归的情况下 当前函数会被递归几次就是 几的n次方+线性
int Fibonacci(int number){
if (number <= 1) return number;
return Fibonacci(number-2)+Fibonacci(number-1);}
5.对数——o(logn)一个变量运行次数=2的N次方=N的那个n次方;
int i=1; while(i<n)i=i*2;
6.线性对数——o(n*logn)外层线性循环,内层对数循环,一个变量运行次数=N或n*一个数;{一个变量运行次数=2的N次方=N的那个n次方;}
线性对数阶$O(nlogn) $,
就是将时间复杂度为对数阶$O(logn)$的代码循环n遍的话,
那么它的时间复杂度就是 n * O(logN),也就是了$O(nlogn)$,如下
for(m=1;m<n; m++) {int i =1;while(i<n)i=i*2;}
考虑时间复杂度,一般考虑最坏的;
//空间复杂度(Space Complexity)
//是对一个算法在运行过程中临时占用存储空间大小的一个量度,
//同样反映的是一个趋势,一个算法所需的存储空间用f(n)表示。
//S(n)=O(f(n)),其中n为问题的规模,S(n)表示空间复杂度。
常见:o(1) o(n)
空间复杂度 $O(1)$ 【算法空间复杂度为一个常量,不随着某个变量n的大小而变化】
如果算法执行所需要的临时空间不随着某个变量n的大小而变化
,即此算法空间复杂度为一个常量,可表示为 O(1)
举例:
int i = 1; int j =2;++i; j++; int m=i+j;
//代码中的 i、j、m 所分配的空间都不随着处理数据量变化
//,因此它的空间复杂度 S(n) = O(1)
//空间复杂度 $O(n)$
//int[] m=newint[n] for(i=1; i<=n; ++i){j=i,j++;}