空间复杂度
空间复杂度概念:
和时间复杂度一样,时对一个算法在运行过程中临时占用存储空间大小的量度。
空间复杂度不是程序占用了多少bytes的空间,因为这也没什么意义,所以空间复杂度算的是变量的个数,也使用大O监禁表示法。
void BubbleSort(int * a,in n){ assert(a) for(size_t end=n;end>0;--end){ int exchange =0; for(size_t i=1;i<end;++i){ if(a[i-1)>a[i]) { Swap(&a[i-1],&a[i]); exchange=1; } } if(exchange == 0) break; } }
答案O(1)
解析:
这里其实总共开辟了三个空间,分别为end.exchange,i;
既然时常数个变量,那么空间复杂度就是O(1),空间复杂度算的时申请的额外空间
苏哦提跟上面的int *a和int n没有关系。
可能有人觉得这个for循环,exchange应该开辟n次,其实每次循环进来,exchange 都会重新开辟,结束一次循环exchange销毁,以此类推,exchange始终时同一个空间。
什么时候会出现O(n)呢?
1.malloc一个数组
int *a=(int *)malloc(sizeof(int)*numsSize);//O(N)
此情况的前提是numsSize必须时一个未知的数字,如果时具体的数字,那么空间复杂度依旧时O(1)
2.变长数组
int a[numsSize];//numsSize未知,O(N)
比如
long long* Fibonacci(size_t n){ if(n==0) return NULL; long long * fibArray = (long long *)malloc(n+1)*sizeof(long long)); fibArray[0]=0; fibArray[1]=1; for(int i=2;i<=n;++i){ fibArray[i] = fibArray[i-1]+fibArray[i-2]; } return fibArray; }
答案:
O(N+1)
解析:
这里看到了malloc 开辟了n+1个大小为long long类型的数组,看到这就不需要在过于计较后续创建了几个变量,因为空间复杂度时估算,所以直接就是O(N).
阶乘递归Fac的空间复杂度?
long long Fac(size_t N){ if(N==0) return 1; return Fac(N-1)*N; }
答案:
O(N)
解析:
这里递归函数是要建立栈帧的,而建立栈帧的个数为N个,每个栈帧的变量都是常数个,N个既复杂度为O(n)
习题:
1.算法执行过程中所粗腰的存储空间称之为算法的(空间复杂度)
2.算法的时间复杂度取决于(问题的规模和待处理数据的初态)
3.for(int i=1;i<=n;i++) c[i]=i;该算法的时间复杂度是(O(n))
4.下面程序段的时间复杂度为(log3n)
i=1;
while(i<=n) i=i*3;
5.下面的时间复杂度()
x=90;y=100;
while(y>0){
if(x>100){
x=x-10;
y--;
}
else{
x++;
}
}
解析:当x执行了是十一次既x=101时,y-1,所以总循环100*11=1100次,所以时间复杂度为O(1).