数据结构学习笔记(二)--空间复杂度

数据结构学习笔记(二)--空间复杂度

过于简单,不做赘述。

点击进入上一篇:数据结构学习笔记(一)--时间复杂度

空间复杂度的定义

空间开销(内存开销)与问题规模n之间的关系。

空间复杂度O(1)的算法

无论问题规模怎么变,算法运行所需的内存空间都是固定的常量,算法空间复杂度为:

S(n) = O(1) (注:S表示“Space”)

算法原地工作 ---算法所需内存空间为常量。

用c语言举例:

//算法1—— 逐步递增型爱你
void loveYou(int n){ //n为问题规模
    int i = 1; //爱你的程度
    while(i<=n){
        i++;
        printf("I Love You %d\n",i);
    }
    //语句5
    printf("I Love You More Than %d\n",n);
}

该代码中,所需内存空间为程序代码所需内存,与局部变量(i和n)所分配内存,与n的大小,问题规模无关,故算法空间复杂度为S(n) = O(1)

空间复杂度O(n)的算法

用c语言举例:

void test(int n){
    int flag[n]; //声明一个长度为n的数组
    int i;
    //....此处省略无关代码
}

S(n) = 4 + 4n + 4 = 4n + 8 = O(n)

重点: 空间复杂度只需关注空间大小与问题规模相关的变量

空间复杂度为O(n²)的算法

用c语言举例:

void test(int n){
    int flag[n][n]; //声明一个长度为n的数组
    int i;
    //....此处省略无关代码
}

此时S(n) = O(n²)

空间复杂度的运算规则

加法规则

与时间复杂度的加法规则相同

乘法规则

与时间复杂度的乘法规则相同

空间复杂度从小到大排列

与时间复杂度相同,常对幂指阶

函数递归调用带来的内存开销

用c语言举例:

//算法5—— 递归型爱你
void loveYou(int n){ //n为问题规模
    int a,b,c; //声明一系列局部变量
    //...省略无关代码
    if(n > 1){
        loveYou(n-1);
    }
    printf("I Love You %d\n",n);
}

此时,每一次递归调用,都分配一遍存储函数的参数和局部变量内存,设每次所需分配内存为n,则n遍递归所需内存为kn,故S(n) = O(n)。空间复杂度 = 递归调用的深度


点击进入下一篇:数据结构学习笔记(三)--线性表的定义和基本操作

posted @ 2021-09-15 21:46  易奔二  阅读(191)  评论(0编辑  收藏  举报