时间复杂度和空间复杂度

时间复杂度:
1.常数——o(1);一个常量运行特定的次数
o(1)表示该算法的执行时间,不论输入输出的数据大小,只要没有循环等复杂结构那他o(1);

2.线性——o(n);一个变量运行次数=N或n*一个数;
o(n)表示一个算法的性能会随这输入数据大小发生变化,for里代码会执行n变,所以它是随n变化的,可以用o(n);
for(int i=0;i
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
6.线性对数——o(n*logn)外层线性循环,内层对数循环,一个变量运行次数=N或n*一个数;{一个变量运行次数=2的N次方=N的那个n次方;}
线性对数阶$O(nlogn) $,
就是将时间复杂度为对数阶$O(logn)$的代码循环n遍的话,
那么它的时间复杂度就是 n * O(logN),也就是了$O(nlogn)$,如下
for(m=1;m
考虑时间复杂度,一般考虑最坏的;

//空间复杂度(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++;} 

你可能感兴趣的:(算法,数据结构,c++,其他)