算法的空间复杂度

空间复杂度

空间复杂度 主要是衡量一个算法运行所需要的额外空间 ,在计算机发展早期 ,计算机的储存容量很小 ,所以空间复杂度是很重要的。但是经过计算机行业的迅速发展 ,计算机的容量已经不再是问题了,所以如今已经不再需要特别关注一个算法的空间复杂度。

空间复杂度也是一个数学表达式,是对一个算法的运行过程中临时占用储存空间大小的量度。

空间复杂度不是程序占用了多少bytes的空间,而是变量个数。空间复杂度计算也是使用大O渐进表示法。

函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

例1:

cpp 复制代码
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[j+1])
            {
                int tmp = a[j];
                a[j] = a[j+1];
                a[j+1] = tmp;
                exchange = 1;
            }
        }
        if(exchange == 0)
            break;
    }
}

冒泡排序,只使用了常数个空间,所以空间复杂度为 O(1);

例2:

cpp 复制代码
int* Fib(int n)
{
    if(n == 0)
        return NULL;
    int* fibarr = (int*)malloc(sizeof(int)*(n+1));
    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:

cpp 复制代码
int fac(int n)
{
    if(n == 0)
        return 1;
    
    return fac(n-1)*n;
}

再fac函数中调用了N次fac函数,递归了N次,开辟了N个栈帧,每个栈使用了常数个空间,所以空间复杂度O(N)

例4:

请回答fib函数的空间复杂度是多少?

cpp 复制代码
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)。

相关推荐
Miraitowa_cheems6 小时前
LeetCode算法日记 - Day 68: 猜数字大小II、矩阵中的最长递增路径
数据结构·算法·leetcode·职场和发展·贪心算法·矩阵·深度优先
希赛网6 小时前
软考软件设计师常考知识点:(三)数据结构
数据结构·二叉树·字符串·软考·软件设计师·线性表
少许极端10 小时前
算法奇妙屋(五)-链表
数据结构·算法·链表
木子.李34711 小时前
数据结构-算法C++(额外问题汇总)
数据结构·c++·算法
程序员莫小特12 小时前
老题新解|计算2的N次方
开发语言·数据结构·算法·青少年编程·信息学奥赛一本通
十重幻想14 小时前
PTA6-1 使用函数求最大公约数(C)
c语言·数据结构·算法
青岛少儿编程-王老师14 小时前
CCF编程能力等级认证GESP—C++5级—20250927
java·数据结构·c++
胖咕噜的稞达鸭17 小时前
C++中的父继子承:继承方式实现栈及同名隐藏和函数重载的本质区别, 派生类的4个默认成员函数
java·c语言·开发语言·数据结构·c++·redis·算法
笑口常开xpr17 小时前
【C++】模板 - - - 泛型编程的魔法模具,一键生成各类代码
开发语言·数据结构·c++·算法
立志成为大牛的小牛18 小时前
数据结构——十四、构造二叉树(王道408)
数据结构·笔记·学习·程序人生·考研