当前位置: 首页 > news >正文

81.【C语言】数据结构之空间复杂度

目录

1.定义

2.例题

计算下列代码中BubbleSort函数的空间复杂度

解:

3.练习

1.求下列代码的空间复杂度

解:

2.求下列代码的空间复杂度

解:


1.定义

对一个算法在运行过程中临时占用存储空间大小的量度,不是程序占用了多少bytes的空间,通常用多少个变量来衡量,也使用大O渐进表示法

(有关大O渐进表示法见80.【C语言】数据结构之时间复杂度)

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

2.例题

计算下列代码中BubbleSort函数的空间复杂度

void BubbleSort(int* a, int 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;}
}

解:

一共额外申请了3个变量:exchange,end,i(这里的数组a和变量n不是额外申请的,存储参数,局部变量,一些寄存器信息等在编译期间已经确定好了)

常数个,空间复杂度为O(1)

3.练习

1.求下列代码的空间复杂度

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;
}
解:

要找额外的空间,可以找与动态内存管理有关的函数(malloc,realloc,calloc函数)

发现(long long *)malloc((n+1) * sizeof(long long))  //这里的n+1是因为从0~n

额外创建了n+1个变量,忽略掉常数后,时间复杂度为O(N)

2.求下列代码的空间复杂度

long long Fac(size_t N)
{if(N == 0)return 1;return Fac(N-1)*N;
}

解:

可以理解为编译器为每一个函数创建一个栈帧,内含常数个空间(空间复杂度为O(1)),从Fac(N)开始至Fac(1),一共创建了N+1个(并没有销毁),即(N+1)*O(1)=O(N)

(有关栈帧的内容见36.【C语言】函数栈帧的创建和销毁)

因此空间复杂度为O(N)


http://www.mrgr.cn/news/49131.html

相关文章:

  • 探索Spring Cloud Config:构建高可用的配置中心
  • 语料库综述
  • vue3学习:数字时钟遇到的两个问题
  • 部分品牌电脑进入BIOS方法
  • RBTree(红黑树)的介绍和实现
  • gaussdb 主备版本8 SQL参考 学习
  • 2024全国科技特长生趋势揭秘
  • 利士策分享,生命的价值是金钱可以丈量的吗?
  • C++基础补充(03)C++20 的 std::format 函数
  • 【Redis】什么是Redis
  • RabbitMQ 入门(二)基本结构和消息模型
  • S4.2.6.1 LTSSM 之 Detect 状态
  • 【C++栈】2434. 使用机器人打印字典序最小的字符串|1953
  • MySQL 删除数据库
  • python 画图|三维散点图输出
  • 现代数字信号处理I-P2概率论学习笔记
  • 基于51单片机的超市商场电子秤MPX4115proteus仿真
  • 基于Java的旅游网站管理系统—计算机毕业设计源码39235
  • LeetCode题练习与总结:区域和检索 - 数组不可变--303
  • 【畅捷通好生意-注册安全分析报告-无验证方式导致安全隐患】