空间复杂度

空间复杂度概念:

和时间复杂度一样,时对一个算法在运行过程中临时占用存储空间大小的量度。

空间复杂度不是程序占用了多少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).

posted @ 2023-12-17 14:35  艾鑫4646  阅读(20)  评论(0编辑  收藏  举报