算法复杂度
算法复杂度分为时间复杂度和空间复杂度
1、时间复杂度
在计算机科学中,算法的时间复杂度是一个函数,它定量的描述了该算法的运行时间,时间复杂度常用大写O表示,不包括这个函数的低阶项和首项系数。
常见的时间复杂度有:
常数阶O(1),
对数阶O(log2 n),
线性阶O(n),
线性对数阶O(n log2 n),
平方阶O(n^2),
立方阶O(n^3)
k次方阶O(n^K),
指数阶O(2^n)。
随着n的增大,时间复杂度增大,算法花费时间越多,效率也会越低。
计算方法
①选取相对增长最高的项
②最高项系数是都化为1
③若是常数的话用O(1)表示
如f(n)=2n^3+2n+100,
则O(n)=n^3。
(1)
int i=0;
while(i<10){
i++;
}
该算法执行10次,次数是常数,则其时间复杂度为O(1);
(2)
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
}
}
这是一个嵌套for循环,外层执行一次,则内层执行n次,其时间复杂度为O(n^2)
(3)
int i=0;
while(i<n||arr[i]!=1)
{
i++;
}
在此循环,如果 arr[i] 不等于1的话,时间复杂度是O(n)。如果arr[i]等于1的话,则循环执行一次判断跳出,时间复杂度是O(1)。
2、空间复杂度
一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需的内存多少有个预先估计,一个程序执行时除了需要内存空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为实现计算所需的辅助空间。程序执行时所需存储空间包括以下两个部分:
(1) 固定部分:这部分空间的大小与输入/输出数据的个数多少、大小无关,主要包括指令空间,数据空间等所占的空间,这部分属于静态空间。
(2) 可变空间:这部分空间主要包括动态分配的空间、递归栈所需的空间。这部分空间的大小与算法有关。
一个算法所需的空间用f(n)表示:
S(n)=O(f(n))
其中,n为问题的复杂度,S(n)为空间复杂度。
计算方法:
①忽略常数,用O(1)表示
②递归算法的空间复杂度=递归深度N*每次递归所要的辅助空间
③对于单线程来说,递归有运行时堆栈,求的是递归最深的那一次压栈所耗费的空间的个数,因为递归最深的那一次所耗费的空间足以容纳它所有递归过程。
(1)
int a;
int b;
int c;
printf("%d %d %d \n",a,b,c);
它的空间复杂度O(n)=O(1);
(2)
int fun(int n){
int k=10;
if(n==k){
return n;
}else{
return fun(++n);
}
}
递归实现,调用fun函数,每次都创建1个变量k。调用n次,空间复杂度O(n*1)=O(n)。