wordpress 遍历用户,优化培训内容,千库网免费素材图库,做网站找不到客户空间复杂度
空间复杂度主要是衡量一个算法运行所需要的额外空间#xff0c;在计算机发展早期#xff0c;计算机的储存容量很小#xff0c;所以空间复杂度是很重要的。但是经过计算机行业的迅速发展#xff0c;计算机的容量已经不再是问题了#xff0c;所以如今已经不再需…空间复杂度
空间复杂度主要是衡量一个算法运行所需要的额外空间在计算机发展早期计算机的储存容量很小所以空间复杂度是很重要的。但是经过计算机行业的迅速发展计算机的容量已经不再是问题了所以如今已经不再需要特别关注一个算法的空间复杂度。
空间复杂度也是一个数学表达式是对一个算法的运行过程中临时占用储存空间大小的量度。
空间复杂度不是程序占用了多少bytes的空间而是变量个数。空间复杂度计算也是使用大O渐进表示法。
函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
例1
void Bubblesort(int* a, int sz)
{for(int i 0; i sz-1; i){int exchange 0;for(int j 0; j sz-1-i; j){if(a[j] a[j1]){int tmp a[j];a[j] a[j1];a[j1] tmp;exchange 1;}}if(exchange 0)break;}
}冒泡排序只使用了常数个空间所以空间复杂度为 O(1); 例2
int* Fib(int n)
{if(n 0)return NULL;int* fibarr (int*)malloc(sizeof(int)*(n1));fibarr[0] 0;fibarr[1] 1;for(int i 2; i n; i){fibarr[i] fibarr[i-1] fibarr[i-2];}return fibarr;
}
fibarr开辟了N个int类型的空间所以空间复杂度为O(N) 例3
int fac(int n)
{if(n 0)return 1;return fac(n-1)*n;
}
再fac函数中调用了N次fac函数递归了N次开辟了N个栈帧每个栈使用了常数个空间所以空间复杂度O(N) 例4
请回答fib函数的空间复杂度是多少
int fib(int n)
{if(n 3)return 1;return fib(n-1) fib(n-2);
} A. O(1) B.O(N) C.O(N^2) D.O(2^N) . . . . . . . . . . . . . .
答案O(N) 对于 fib(n)递归调用的最大深度取决于 n因为每次递归都会对 n−1或 n−2进行调用。
尽管函数中有很多重复计算导致时间复杂度是指数级的但调用栈的最大深度只与输入 n 的大小成线性关系。
比如调用 fib(n)最深的递归路径是 fib(n) → fib(n-1) → fib(n-2) → ... → fib(1)。
每次递归调用都需要在栈上分配空间。最大栈深度是递归树的高度。在这种实现方式下递归树的高度为 O(n)。